gpt4 book ai didi

php - docker-compose使用旧卷

转载 作者:行者123 更新时间:2023-12-02 19:35:27 24 4
gpt4 key购买 nike

我正在尝试使用docker-compose建立CI管道,并且正在努力了解命名卷的工作方式...

作为Dockerfile的一部分,我复制了应用程序文件,然后运行composer install安装应用程序依赖项。我想与正在运行的其他容器共享applicaton文件的某些元素以及要与之共享的依存关系,这些依存关系被设置为运行以执行实用程序过程(例如,运行数据库迁移)。请参阅以下示例:

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

docker-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运行该镜像,则可以看到所有最新文件都没有问题。因此,这绝对是特定于组合的问题。

我认为我需要做一些事情,例如清除卷缓存,但是我尝试过的一切似乎都行不通。我只能假设我误解了卷的概念。

任何帮助将不胜感激。谢谢!

最佳答案

这里的问题与在构建中定义的位置上安装卷有关。图像的第一个版本将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

关于php - docker-compose使用旧卷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45823470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com