首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker-使用旧卷组成

问docker-使用旧卷组成
EN

Stack Overflow用户
提问于 2017-08-23 01:12:15
回答 2查看 1.4K关注 0票数 1

我正在尝试使用docker-compose设置CI管道,并且正在努力理解命名卷是如何工作的……

作为Dockerfile文件的一部分,我复制应用程序文件,然后运行composer install来安装应用程序依赖项。有一些应用程序文件的元素和依赖项,我希望与正在运行的其他容器共享,/这些容器被设置为运行以执行实用程序进程(例如运行数据库迁移)。如下例所示:

Dockerfile:

代码语言:javascript
复制
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

代码语言:javascript
复制
 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运行镜像,我可以看到所有最新的文件都没有问题。所以这绝对是一个特定于作曲的问题。

我假设我需要做一些事情,比如清除卷缓存,但无论我尝试了什么,似乎都不起作用。我只能假设我误解了体积的概念。

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

EN

回答 2

Stack Overflow用户

发布于 2017-08-23 01:21:45

这里的问题与在构建中定义的位置上安装卷有关。映像的第一次构建让composer将其输出放到/app中,第一次构建的第一次运行将名为app的卷挂载到/app。这在顶部使用了一个新的写入层,从而破坏了/app的镜像版本。在映像的第二个构建版本上挂载此命名卷将保留/app的原始内容。

不使用命名卷,而是使用volumes-from将导出的/app卷从web加载到migration容器中。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-08-23 03:28:24

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

CMD composer安装--no-dev

RUN和CMD都是Dockerfile指令。

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

例如,如果你想在你的Docker镜像中安装一个包或者创建一个目录,那么RUN将是你想要使用的。例如,运行mkdir -p /path/to/folder。

CMD允许您定义在容器启动时运行的默认命令。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45823470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档