我正在尝试使用 docker-compose 设置 CI 管道,并且正在努力了解命名卷的工作原理......
作为 Dockerfile 的一部分,我复制应用程序文件,然后运行composer install
以安装应用程序依赖项。应用程序文件的一些元素和我想与正在运行的其他容器共享的依赖项/被设置为运行以执行实用程序进程(例如运行数据库迁移)。请参见下面的示例:
Dockerfile:
FROM php:5.6-apache
# Install dependencies
COPY composer.* /app/
RUN composer install --no-dev
# Copy application files
COPY bin bin
COPY environment.json environment.json
VOLUME /app
码头工人-compose.yml
web:
build:
context: .
dockerfile: docker/web/Dockerfile
volumes:
- app:/app
- ~/.cache/composer:/composer/cache
migrations:
image: my-image
depends_on:
- web
environment:
- DB_DRIVER=pdo_mysql
- AUTOLOADER=../../../vendor/autoload.php
volumes:
- app:/app
working_dir: /app/vendor/me/my-lib
volumes:
app:
在上面的示例中(省略了无关信息),我有一个“迁移”服务,该服务从使用 composer 安装的应用程序依赖项中提取迁移。我的想法是,当我执行docker-compose build
后续操作时docker-compose up
,它会调出具有最新依赖项的最新软件版本,并同时运行最新的迁移。
这第一次工作正常。不幸的是,在随后的运行中,我无法让 docker-compose 使用新版本。如果我运行docker-compose build
,我可以看到composer install
运行并安装所有最新的库,但是当我进入容器时docker-compose run web /bin/bash
,旧的依赖项就在那里!如果我直接用 运行图像docker run web_1
,我可以看到所有最新的文件没有问题。所以这绝对是一个特定于撰写的问题。
我想我需要做一些事情,比如清除卷缓存,但无论我尝试过什么似乎都不起作用。我只能假设我误解了卷的概念。
任何帮助将不胜感激。谢谢!