我的目标是在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
语句之后 之后,这似乎是合乎逻辑的。但是我该如何解决呢?我仍然想在这里使用卷而不是ADD
或COPY
命令。
答案 0 :(得分:1)
您可以结合使用bind mounts
和volume
来达成目标,这是供参考的最小示例:
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使您有机会自己管理数据。