Docker-Compose挂载本地卷失败:本地Ubuntu正常,DO Droplet异常
Docker-Compose 部署到DigitalOcean Droplet时本地卷挂载失败问题解决
问题背景
本地Ubuntu机器上可正常运行的Docker-Compose配置,部署到DigitalOcean Droplet时出现本地卷挂载失败。确认创建容器时./client/build文件夹存在(仅为空,未执行yarn build),怀疑是权限问题但不确定。
错误信息
Attaching to client, db, server, webserver Error response from daemon: error while mounting volume '/var/lib/docker/volumes/app_web-root/_data': failed to mount local volume: mount ./client/build/:/var/lib/docker/volumes/app_web-root/_data, flags: 0x1000: no such file or directory
应用目录结构
基础目录
-rw-rw-r-- 1 me me 1215 Jul 22 02:15 README.md drwxrwxr-x 6 me me 4096 Jul 22 16:50 client -rw-rw-r-- 1 me me 1447 Jul 22 17:14 docker-compose.yml drwxr-xr-x 2 root root 4096 Jul 22 16:37 nginx-conf drwxrwxr-x 10 me me 4096 Jul 22 16:37 server
Client目录
-rw-rw-r-- 1 me me 228 Jul 22 02:15 Dockerfile drwxrwxr-x 2 me me 4096 Jul 22 16:50 build -rw-rw-r-- 1 me me 602 Jul 22 02:15 craco.config.js drwxr-xr-x 2 root root 4096 Jul 22 02:20 node_modules -rw-r--r-- 1 root root 2035 Jul 22 16:37 package.json drwxrwxr-x 3 me me 4096 Jul 22 02:15 public drwxrwxr-x 5 me me 4096 Jul 22 02:15 src -rw-r--r-- 1 root root 488599 Jul 22 16:37 yarn.lock
原Docker-Compose配置
version: '3.7' services: db: container_name: db image: mysql command: --default-authentication-plugin=mysql_native_password restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: database_development MYSQL_PASSWORD: root cap_add: - SYS_NICE networks: - app-network client: container_name: client build: ./client ports: - 3000:3000 volumes: - ./client:/app - /app/node_modules environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true networks: - app-network server: container_name: server build: ./server ports: - 8080:8080 - 4242:4242 volumes: - ./server:/app - /app/node_modules - web-root:/build depends_on: - db environment: - NODE_ENV=development networks: - app-network webserver: image: nginx:mainline-alpine container_name: webserver restart: unless-stopped ports: - "80:80" volumes: - web-root:/var/www/html - ./nginx-conf:/etc/nginx/conf.d #- certbot-etc:/etc/letsencrypt #- certbot-var:/var/lib/letsencrypt depends_on: - server networks: - app-network volumes: web-root: driver: local driver_opts: type: none device: ./client/build o: bind networks: app-network: driver: bridge
问题原因
原配置中web-root卷通过driver_opts绑定到./client/build相对路径。在DigitalOcean Droplet环境中,Docker daemon运行时的工作目录与执行docker-compose up的目录存在上下文差异,导致无法正确解析该相对路径,即使目录实际存在也会触发"no such file or directory"错误。本地Ubuntu环境中路径解析正常是因为Docker daemon的工作目录与命令执行目录一致。
解决方案
移除web-root卷的driver_opts绑定配置,将其作为普通命名卷使用,同时让client服务也挂载该卷到/build目录,实现多服务共享同一卷。修改后的配置如下:
version: '3.7' services: db: container_name: db image: mysql command: --default-authentication-plugin=mysql_native_password restart: always ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: database_development MYSQL_PASSWORD: root cap_add: - SYS_NICE networks: - app-network client: container_name: client build: ./client ports: - 3000:3000 volumes: - ./client:/app - web-root:/build - /app/node_modules environment: - NODE_ENV=development - CHOKIDAR_USEPOLLING=true networks: - app-network server: container_name: server build: ./server ports: - 8080:8080 - 4242:4242 volumes: - ./server:/app - /app/node_modules - web-root:/build depends_on: - db environment: - NODE_ENV=development networks: - app-network webserver: image: nginx:mainline-alpine container_name: webserver restart: unless-stopped ports: - "80:80" volumes: - web-root:/var/www/html - ./nginx-conf:/etc/nginx/conf.d #- certbot-etc:/etc/letsencrypt #- certbot-var:/var/lib/letsencrypt depends_on: - server networks: - app-network volumes: web-root: networks: app-network: driver: bridge
内容的提问来源于stack exchange,提问作者i suck at programming
相关产品推荐
相关产品推荐

