我正在尝试使用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
运行图像,我可以看到所有最新文件没问题。所以这绝对是一个具体的问题。
我认为我需要做一些事情,比如清除卷缓存,但无论我尝试过什么似乎都不起作用。我只能假设我误解了卷的概念。
非常感谢任何帮助。谢谢!
答案 0 :(得分:0)
此处的问题与在构建中定义的位置上安装卷有关。图像的第一个版本composer
将其输出放入/app
,第一次构建的第一次运行将app
命名卷安装到/app
。这破坏了/app
的图像版本,顶部有一个新的写入层。在图像的第二个版本上安装此命名卷将保留/app
的原始内容。
使用volumes-from
将导出的/app
卷从web
加载到migration
容器中,而不是使用命名卷。
version: '2'
services:
web:
build:
context: .
dockerfile: docker/web/Dockerfile
volumes:
- ~/.cache/composer:/composer/cache
migrations:
image: docker-registry.efficio.digital:5043/doctrine-migrator:1.1
depends_on:
- web
environment:
- DB_DRIVER=pdo_mysql
- AUTOLOADER=../../../vendor/autoload.php
volumes_from:
- web:ro
答案 1 :(得分:0)
我从您的问题中了解到,您希望每次运行容器时都运行composer install。在这种情况下,您必须使用CMD指令来执行该命令。
CMD编辑器安装--no-dev
RUN和CMD都是Dockerfile指令。
RUN允许您在Docker镜像内执行命令。这些命令在构建时执行一次,并作为新层写入Docker镜像。
例如,如果您想在Docker镜像中安装包或创建目录,那么RUN将是您想要使用的。例如,RUN mkdir -p / path / to / folder。
CMD允许您定义在容器启动时运行的默认命令。
你可以说CMD是一个Docker运行时操作,这意味着它不是在构建时执行的东西。运行图像时会发生这种情况。正在运行的图像称为容器。