【问题标题】:Docker compose volume overrides COPY in multi-stage buildDocker compose volume 在多阶段构建中覆盖 COPY
【发布时间】:2019-07-16 21:35:24
【问题描述】:

我的目标是在 docker 文件的一个阶段获取 php 依赖项,然后将这些依赖项复制到下一阶段(vendor/ 目录)。但是,一旦在docker-compose.yml 中指定了一个卷,它将覆盖COPY 语句,就好像它从未发生过一样。

docker-compose.yml

version: "3"

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    volumes:
      - .:/var/www/html

docker/app/Dockerfile

FROM composer AS php_builder
COPY . /app
RUN composer install --no-dev

FROM php:7.1-fpm
COPY --from=php_builder /app/vendor /var/www/html/vendor

构建和运行它的结果是一个/var/www/html 目录,它没有我期望的vendor/ 目录。

我的猜测是,这是因为docker-compose.yml 服务定义中指定的卷实际上发生在COPY --from 语句之后,这似乎是合乎逻辑的。但是我该如何解决呢?我仍然想在这里使用卷而不是ADDCOPY 命令。

【问题讨论】:

  • 唯一的选择是将供应商文件夹放在其他地方,因为卷总是会覆盖它。无论如何,它不应该在 docroot 中。

标签: php docker docker-compose


【解决方案1】:

你可以结合bind mountsvolume来做你的目标,一个最小的例子供你参考:

docker-compose.yaml:

version: "3"

services:
  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    volumes:
      - my_folder:/var/www/html/vendor
      - .:/var/www/html

volumes:
  my_folder:

docker/app/Dockerfile:

FROM composer AS php_builder
COPY . /app
#RUN composer install --no-dev
RUN mkdir -p vendor && echo "I'm dependency!" > vendor/dependencies.txt

FROM php:7.1-fpm
COPY --from=php_builder /app/vendor /var/www/html/vendor

结果:

shubuntu1@shubuntu1:~/test$ ls
docker  docker-compose.yaml  index.php
shubuntu1@shubuntu1:~/test$ docker-compose up -d
Creating network "test_default" with the default driver
Creating test_app_1 ... done
shubuntu1@shubuntu1:~/test$ docker exec -it test_app_1 /bin/bash
root@bf59d8684581:/var/www/html# ls
docker  docker-compose.yaml  index.php  vendor
root@bf59d8684581:/var/www/html# cat vendor/dependencies.txt
I'm dependency!

通过上面的执行,你可以看到Dockerfile第一阶段生成的dependencies.txt在容器中仍然可以看到,volume只是由docker自己管理数据,而bind mounts给你机会自己管理数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2023-04-06
    相关资源
    最近更新 更多