Docker Compose挂载package.json失败:无法同步文件的问题排查
使用Docker Compose部署Parse Server与MongoDB时,尝试通过volumes将本地./parse-server/package.json挂载到容器内/parse-server/package.json路径,执行docker-compose up -d server启动服务失败,报错提示挂载类型不匹配。
配置文件
version: '3.9' services: database: image: mongo:3.6 restart: on-failure ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: admin volumes: - mongo_data:/data/db server: restart: on-failure image: parseplatform/parse-server:5.2.3 ports: - 1337:1337 - 9229:9229 environment: - PARSE_SERVER_APPLICATION_ID=$SERVER_APPLICATION_ID - PARSE_SERVER_APPLICATION_NAME=$SERVER_APPLICATION_NAME - PARSE_SERVER_MASTER_KEY=$SERVER_MASTER_KEY - PARSE_SERVER_DATABASE_URI=mongodb://admin:admin@mongo/parse_server?authSource=admin - PARSE_SERVER_MOUNT_GRAPHQL=true - PARSE_SERVER_CLOUD=/parse-server/cloud/main.js - PARSE_SERVER_GRAPH_QLSCHEMA=/parse-server/cloud/schema_2.graphql links: - database:mongo depends_on: - database entrypoint: "node --inspect=0.0.0.0:9229 /parse-server/bin/parse-server" volumes: - parse_server_cloud:/parse-server/cloud - ./parse-server/package.json:/parse-server/package.json volumes: mongo_data: parse_server_cloud: driver: local driver_opts: type: none device: ./parse-server/cloud o: bind
启动命令
docker-compose up -d server
报错信息
ERROR: for 043a399a1ce9_docker_server_1 Cannot start service server:
failed to create shim task: OCI runtime create failed: runc create
failed: unable to start container process: error during container
init: error mounting "PRJ_PATH/docker/parse-server/package.json" to
rootfs at "/parse-server/package.json": mount
PRJ_PATH/docker/parse-server/package.json:/parse-server/package.json
(via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are
you trying to mount a directory onto a file (or vice-versa)? Check if
the specified host path exists and is the expected typeERROR: for server Cannot start service server: failed to create shim
task: OCI runtime create failed: runc create failed: unable to start
container process: error during container init: error mounting
"PRJ_PATH/docker/parse-server/package.json" to rootfs at
"/parse-server/package.json": mount
PRJ_PATH/docker/parse-server/package.json:/parse-server/package.json
(via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are
you trying to mount a directory onto a file (or vice-versa)? Check if
the specified host path exists and is the expected type ERROR:
Encountered errors while bringing up the project.
容器内ls -l输出
total 648 drwxr-xr-x 1 root root 70 Jun 17 2022 bin drwxrwxrwx 1 node node 384 Mar 27 07:42 cloud drwxr-xr-x 1 root root 0 Mar 27 06:59 config drwxr-xr-x 1 root root 916 Jun 17 2022 lib drwxr-xr-x 1 node node 110 Mar 27 06:59 logs drwxr-xr-x 1 root root 7818 Jun 17 2022 node_modules -rw-r--r-- 1 root root 654393 Jun 17 2022 package-lock.json -rw-r--r-- 1 root root 6289 Jun 17 2022 package.json drwxr-xr-x 1 root root 280 Jun 17 2022 public_html drwxr-xr-x 1 root root 30 Jun 17 2022 views
问题根源
报错明确指出:你试图挂载的本地路径PRJ_PATH/docker/parse-server/package.json是目录,但容器内目标路径/parse-server/package.json是文件,挂载类型不匹配导致失败。
可能的触发原因:
- 本地误将
./parse-server/package.json创建成了目录,而非文件; - 本地
./parse-server目录下不存在package.json文件,Docker尝试挂载时自动生成了同名目录。
修复步骤
检查并修正本地路径类型
进入本地PRJ_PATH/docker/parse-server目录,执行命令确认路径类型:ls -ld package.json若输出显示为目录(以
drwxr-xr-x开头),则删除该目录并创建正确的文件:rm -rf package.json # 可从容器复制默认package.json,或自行编写 docker cp <容器ID>:/parse-server/package.json ./parse-server/移除不必要的挂载(推荐)
直接从容器的volumes配置中删除- ./parse-server/package.json:/parse-server/package.json这一行。从容器内ls输出可知,Parse Server镜像本身已自带package.json,若无特殊定制需求,无需挂载替换。确保挂载路径存在
若确实需要自定义package.json,必须确保本地文件已存在后再启动容器——Docker不会自动创建文件类型的挂载目标。
内容的提问来源于stack exchange,提问作者Mircea

