Я пытаюсь настроить конвейер 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
Я могу видеть все последние файлы без проблем. Так что это определенно специфическая проблема.
Я предполагаю, что мне нужно сделать что-то вроде очистки кэша тома, но все, что я пробовал, похоже, не работает. Я могу только предположить, что я неправильно понимаю идею объемов.
Любая помощь будет принята с благодарностью. Спасибо!
Из вашего вопроса я понимаю, что вы хотите запускать composer install каждый раз, когда запускаете свой контейнер. В этом случае вы должны использовать инструкцию CMD для выполнения этой команды.
CMD composer установить —no-dev
RUN и CMD являются инструкциями Dockerfile.
RUN позволяет вам выполнять команды внутри вашего образа Docker. Эти команды выполняются один раз во время сборки и записываются в ваш образ Docker как новый слой.
Например, если вы хотите установить пакет или создать каталог внутри своего образа Docker, то RUN будет тем, что вы захотите использовать. Например, запустите mkdir -p / path / to / folder.
CMD позволяет вам определить команду по умолчанию для запуска при запуске вашего контейнера.
Можно сказать, что CMD — это операция во время выполнения Docker, то есть это не то, что выполняется во время сборки. Это происходит, когда вы запускаете изображение. Работающее изображение называется контейнером.
Проблема здесь связана с монтированием тома в месте, определенном в сборке. Первая сборка изображения имеет 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