迁移Docker数据目录及Compose文件后启动失败问题排查
问题:Docker Compose启动时仍引用旧路径/data的解决办法
之前将Docker容器挂载在/data/dockerdata,现在迁移到新系统后,挂载路径改为/mydocs/dockerdata,同时Compose文件从/data/Dev/docker/compose迁移到/mydocs/Dev/docker/compose。
已配置/etc/docker/daemon.json:
$ cat /etc/docker/daemon.json {"data-root":"/mydocs/dockerdata"}
当前Compose文件目录结构:
/mydocs/Dev/docker/compose$ ll total 36K lrwxrwxrwx 1 david david 33 Nov 7 2021 compose.yml -> ignition-8.1.11-postgres-14.0.yml drwxrwxr-x 2 david david 4.0K Nov 5 2021 db-init -rw-rw-r-- 1 david david 1.3K Oct 18 10:49 ignition-8.1.11-postgres-14.0.yml -rw-rw-r-- 1 david david 1.5K Mar 5 2021 ignition-8.1.1-postgres-13.1.host.yml -rw-rw-r-- 1 david david 1.3K Mar 7 2021 ignition-8.1.1-postgres-13.1.ports.yml -rw-rw-r-- 1 david david 1.3K Mar 7 2021 ignition-8.1.1-postgres-13.1.yml drwxrwxr-x 2 david david 4.0K Nov 5 2021 secrets
执行docker compose命令时出现错误:
$ docker compose -f compose.yml start [+] Running 0/0 ⠋ Container compose_gateway_1 Starting 0.0s ⠋ Container compose_db_1 Starting 0.0s Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /data/Dev/docker/compose/secrets/GATEWAY_PASSWORD
Compose文件内容:
# compose.yml services: gateway: image: kcollins/ignition:8.1.11 ports: - "8088:8088" stop_grace_period: 30s secrets: - gateway-password volumes: # - ./gateway_backup.gwbk:/restore.gwbk - gateway_data:/var/lib/ignition/data logging: driver: "json-file" options: max-size: "200k" max-file: "10" environment: GATEWAY_SYSTEM_NAME: DockerGW GATEWAY_ADMIN_USERNAME: david GATEWAY_ADMIN_PASSWORD_FILE: /run/secrets/gateway-password db: image: postgres:14.0 ports: - "5432:5432" volumes: - db_data:/var/lib/postgresql/data - ./db-init:/docker-entrypoint-initdb.d logging: driver: "json-file" options: max-size: "200k" max-file: "10" secrets: - postgres-password environment: POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password POSTGRES_DB: ignition POSTGRES_USER: ignition secrets: postgres-password: file: ./secrets/POSTGRES_PASSWORD gateway-password: file: ./secrets/GATEWAY_PASSWORD volumes: gateway_data: db_data:
环境信息:
Docker version 27.3.1, build ce12230 Ubuntu 24.04LTS
原因分析
错误提示的旧路径是因为Docker保留了之前容器的配置元数据。迁移Compose文件和数据路径后,原有容器、secret的绑定配置未被清除,启动时会复用旧路径,而非读取新Compose文件的相对路径。
解决步骤
停止并删除现有容器
先停止当前容器,再彻底删除:docker compose -f compose.yml stop docker compose -f compose.yml rm -f清理旧的Secret配置
Docker已创建基于旧路径的secret,需要手动删除:docker secret rm gateway-password postgres-password重新部署容器
使用up命令重新创建容器,Docker会读取当前目录的相对路径生成新的绑定配置:docker compose -f compose.yml up -d验证配置
查看容器挂载信息,确认路径已更新:docker inspect compose_gateway_1 | grep -A 10 "Mounts"
额外说明
daemon.json中的data-root仅控制Docker存储镜像、容器数据的根目录,不会自动更新已存在容器的挂载/secret配置。- 避免使用
docker compose start,该命令仅启动已有容器并复用旧配置;docker compose up会根据当前Compose文件重新创建所有相关资源。
内容的提问来源于stack exchange,提问作者iamthebull
相关产品推荐
相关产品推荐

