docker工 – 使用旧卷撰写

我正在尝试与docker-composebuild立一个CIpipe道,并且正在努力了解命名卷的工作原理。

作为我的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组成使用新版本。 如果我运行docker-compose build ,我可以看到composer install运行并安装所有最新的库,但是当我进入与docker-compose run web /bin/bash的容器时,旧的依赖关系在那里! 如果我直接用docker run web_1 ,我可以看到所有最新的文件没有问题。 所以这绝对是一个具体的问题。

我假设我需要做一些清理音量caching的事情,但无论我尝试过什么似乎都不起作用。 我只能假设我误解了卷的想法。

任何帮助将非常感激。 谢谢!

我从你的问题中了解到,你想在每次运行容器时运行composer php安装。 在这种情况下,您必须使用CMD指令来执行该命令。

CMDcomposer php安装–no-dev

RUN和CMD都是Dockerfile指令。

RUN允许您在Docker镜像中执行命令。 这些命令在构build时被执行一次,并作为一个新层写入Docker镜像。

例如,如果你想安装一个软件包或者在你的Docker镜像里面创build一个目录,那么RUN就是你想要使用的。 例如,运行mkdir -p / path / to /文件夹。

CMD允许您定义一个默认命令,以在容器启动时运行。

你可以说CMD是一个Docker运行时操作,这意味着它不是在构build时被执行的东西。 运行图像时会发生这种情况。 正在运行的图像被称为容器。

这里的问题与在构build中定义的位置上安装卷有关。 该图像的第一个版本已经composer把它的输出到/app ,并且第一个版本的第一次运行将名为volume的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