You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 17:48:08