docker-compose, используя старые тома

Я пытаюсь настроить конвейер CI с помощью docker-compose и пытаюсь понять, как работают именованные тома …

Как часть моего 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

Решение

Из вашего вопроса я понимаю, что вы хотите запускать composer install каждый раз, когда запускаете свой контейнер. В этом случае вы должны использовать инструкцию CMD для выполнения этой команды.

CMD composer установить —no-dev

RUN и CMD являются инструкциями Dockerfile.

RUN позволяет вам выполнять команды внутри вашего образа Docker. Эти команды выполняются один раз во время сборки и записываются в ваш образ Docker как новый слой.

Например, если вы хотите установить пакет или создать каталог внутри своего образа Docker, то RUN будет тем, что вы захотите использовать. Например, запустите mkdir -p / path / to / folder.

CMD позволяет вам определить команду по умолчанию для запуска при запуске вашего контейнера.

Можно сказать, что CMD — это операция во время выполнения Docker, то есть это не то, что выполняется во время сборки. Это происходит, когда вы запускаете изображение. Работающее изображение называется контейнером.

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
0

По вопросам рекламы [email protected]