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

迁移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文件的相对路径。

解决步骤

  1. 停止并删除现有容器
    先停止当前容器,再彻底删除:

    docker compose -f compose.yml stop
    docker compose -f compose.yml rm -f
    
  2. 清理旧的Secret配置
    Docker已创建基于旧路径的secret,需要手动删除:

    docker secret rm gateway-password postgres-password
    
  3. 重新部署容器
    使用up命令重新创建容器,Docker会读取当前目录的相对路径生成新的绑定配置:

    docker compose -f compose.yml up -d
    
  4. 验证配置
    查看容器挂载信息,确认路径已更新:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:57:40