Я занимаюсь разработкой PHP-приложения, которое я хочу запускать с использованием Docker-контейнеров. Я использую композитор менеджер пакетов, который вытягивает все зависимости. Весь код хранится в репозитории git, кроме зависимостей.
Чтобы все работало на моей локальной машине, я использую docker-compose (рис.). Я монтирую код своего приложения (включая папку vendor) на том в моих контейнерах. Вот мой файл docker-compose.yml.
nginx:
image: nginx:1.9
links:
- php
volumes:
- conf/nginx/default.conf:/etc/nginx/conf.d/default.conf
- src:/var/www/html
ports:
- "80:80"php:
image: php:5.6.9-fpm
links:
- memcached
volumes:
- conf/php/php.ini /usr/local/etc/php/php.ini
- src:/var/www/html
volumes_from:
- nginx
На самом деле я не понимаю, как бы я продвинул это в производственную или промежуточную среду. Из того, что я понимаю, лучше всего отправлять все в контейнере без запуска менеджера пакетов, потому что это может привести к сбою или пакеты могут не совпадать с пакетами на моей локальной машине. Поэтому я создал следующий файл docker-compose.yml:
webapp:
image : quay.io/myusername/myrepo
php:
image: php:5.6.9-fpm
volumes:
- config/php/php.ini /usr/local/etc/php/php.ini
volumes_from:
- webapp
nginx:
image: nginx:1.9
links:
- php
volumes:
- config/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
- webapp
ports:
- "80:80"
Контейнер webapp создается из следующего dockerfile и размещается в некотором репозитории.
FROM busybox
VOLUME /var/www/html
ADD src /var/www/html
У меня есть git hook, который запустит сборку этого dockerfile на quay.io и добавит мой исходный код к изображению.
Вот проблема: файлы / зависимости производителя не контролируются версиями, поэтому они не будут добавлены.
Я вижу два решения, которые я не нахожу идеальными.
composer install
втянуть все файлы. Не предпочтительно, как указано выше.Я все еще очень плохо знаком с докером, так что, может быть, я все неправильно понял. Хотелось бы получить ответ, как это сделать правильно.
Ваш Dockerfile
должен создать образ контейнера, как если бы не было подключенных томов. Клонируйте или скопируйте свой код в контейнер, запустите composer для установки зависимостей. Запуск контейнера без каких-либо объемов должен работать.
Тома в производственных средах предназначены главным образом для хранения данных и журналов. Ваш код не должен быть в подключенном томе.
В целях разработки вы можете смонтировать том в расположение кода, и ваш контейнер все равно будет работать.
Чтобы ускорить процесс сборки, скопируйте composer.json
а также composer.lock
сначала файлы и установите зависимости в место за пределами вашего исходного дерева. Это обеспечит обновление зависимостей только при изменении файла json, а не при каждом изменении кода, что значительно ускоряет процесс.
Других решений пока нет …