Docker Compose挂载${PWD}/data卷失败,如何自动创建不存在的目录?
问题:Docker Compose绑定本地目录不存在时启动失败
执行docker-compose up启动服务时,卷配置引用了${PWD}/data目录,但该目录事先不存在,导致启动抛出异常。原以为Docker Compose会自动创建该目录,实际并未如此。
错误信息
test-docker-compose_tor_1 is up-to-date Creating test-docker-compose_walletserver_1 ... error ERROR: for test-docker-compose_walletserver_1 Cannot create container for service walletserver: failed to mount local volume: mount /tmp/test-docker-compose/data:/var/lib/docker/volumes/bitcoin-s/_data, flags: 0x1000: no such file or directory ERROR: for walletserver Cannot create container for service walletserver: failed to mount local volume: mount /tmp/test-docker-compose/data:/var/lib/docker/volumes/bitcoin-s/_data, flags: 0x1000: no such file or directory ERROR: Encountered errors while bringing up the project.
当前docker-compose.yml配置
version: "3.8" services: walletserver: image: bitcoinscala/bitcoin-s-server:latest entrypoint: ["/opt/docker/bin/bitcoin-s-server", "--datadir", "/bitcoin-s", "--conf", "/opt/docker/docker-application.conf"] restart: on-failure volumes: - datadir:/bitcoin-s volumes: datadir: name: "bitcoin-s" driver: local external: false driver_opts: o: bind type: none device: ${PWD}/data # note if i change this to ${PWD}, this works
版本信息
docker --version Docker version 20.10.17, build 100c701
docker-compose version 1.29.2, build 5becea4c
解决方案
方案1:改用直接绑定挂载(推荐)
放弃自定义本地卷的配置,直接在服务的volumes字段使用主机路径:容器路径的绑定挂载语法,Docker Compose会自动创建不存在的主机目录:
version: "3.8" services: walletserver: image: bitcoinscala/bitcoin-s-server:latest entrypoint: ["/opt/docker/bin/bitcoin-s-server", "--datadir", "/bitcoin-s", "--conf", "/opt/docker/docker-application.conf"] restart: on-failure volumes: - ${PWD}/data:/bitcoin-s # 直接绑定,自动创建缺失的data目录
方案2:启动前手动创建目录
在执行docker-compose up前先创建目标目录,适用于需要保留自定义卷配置的场景。Linux/macOS下可执行:
mkdir -p ${PWD}/data && docker-compose up
也可以将该命令写入脚本,避免重复手动操作。
方案3:通过容器启动脚本创建目录
修改服务的entrypoint,先在容器内创建目录(前提是${PWD}已存在),再启动服务:
version: "3.8" services: walletserver: image: bitcoinscala/bitcoin-s-server:latest entrypoint: ["sh", "-c", "mkdir -p /bitcoin-s && /opt/docker/bin/bitcoin-s-server --datadir /bitcoin-s --conf /opt/docker/docker-application.conf"] restart: on-failure volumes: - ${PWD}/data:/bitcoin-s
原因说明
使用driver: local配合driver_opts的bind模式时,Docker会直接尝试挂载指定的device路径,该路径必须事先存在——这和直接绑定挂载的行为不同,后者会自动创建不存在的主机目录。
内容的提问来源于stack exchange,提问作者Chris Stewart
相关产品推荐
相关产品推荐

