如何在docker-compose的build指令中使用自定义卷?
如何在docker-compose的build指令中使用自定义卷?
嘿,我明白你的问题了——你想把自定义卷作为构建镜像的上下文,但这里有个关键误区:Docker的build阶段是在主机上执行的,它没法直接访问Docker卷里的内容,build.context参数要求的是主机本地的文件系统路径,而不是卷的名称。
先看你的配置,其实你的root_volume是个绑定挂载(bind mount),它直接指向了主机上的/home/user/test目录。那最简单的解决办法就是直接把build的context设为这个主机路径,不用绕卷:
修改后的docker-compose.yml应该是这样:
volumes: root_volume: driver: local driver_opts: device: "/home/user/test" type: none nginx: build: context: /home/user/test # 直接用主机上的实际目录路径 dockerfile: nginx.Dockerfile container_name: test_nginx restart: unless-stopped tty: true ports: - "8015:80" networks: - test_network # 如果容器运行时需要挂载这个卷,再加下面这行 # volumes: # - root_volume:/path/inside/container
要是你的卷不是绑定挂载,而是普通的named volume(比如不是指向主机目录的),那你得先把卷里的内容同步到主机的某个临时目录,再用这个目录作为build context。比如可以用临时容器来复制内容:
# 启动临时容器挂载目标卷,把内容复制到主机的临时构建目录 docker run --rm -v root_volume:/volume alpine cp -r /volume/. /tmp/nginx-build-context
然后在docker-compose里把context: /tmp/nginx-build-context就行,不过这种方法需要手动执行同步步骤,自动化程度低,一般只在特殊场景用。
总的来说,build阶段只能用主机本地路径,绑定挂载的卷直接用对应的主机目录是最顺畅的方案~
备注:内容来源于stack exchange,提问作者M a m a D
相关产品推荐
相关产品推荐

