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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:06:29