Docker compose卷在多阶段构建中覆盖了COPY

时间:2019-07-16 21:35:24

标签: php docker docker-compose

我的目标是在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命令。

1 个答案:

答案 0 :(得分: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!

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