Я хочу использовать docker-compose
собрать вместе php и несколько баз данных (orientdb, neo4j и т. д.). Затем попасть в php
контейнер и использовать оболочку для выполнения команд.
По отдельности все мои контейнеры работают плавно, и когда я собираю их вместе, все они бегут. Тем не менее, я не могу на всю жизнь понять, как сохранить php
Контейнер жив, так что я могу попасть в него для тестирования.
Для простоты я просто буду использовать одну базу данных: orient-db.
мой docker-compose.yml
файл:
version: '2'
services:
php:
build: .
links:
- orientdb
orientdb:
image: orientdb:latest
environment:
ORIENTDB_ROOT_PASSWORD: rootpwd
ports:
- "2424:2424"- "2480:2480"
Мой «php» Dockerfile
:
FROM php:5.6-cli
ADD . /spider
WORKDIR /spider
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer
RUN composer install --prefer-source --no-interaction
RUN yes | pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini
Я пытался (среди прочего):
docker-compose up
в одном терминале, а затем docker attach
в другойtty
а также stdin_open
в моем файле сочинения/bin/bash
командаCMD exec vendor/bin/phpunit -D FOREGROUND
И некоторые ссылки, которые я пробовал:
— Как сохранить работоспособность Docker-контейнера после запуска служб?
— https://github.com/docker/compose/issues/1926
— https://github.com/docker/compose/issues/423
Любая помощь будет принята с благодарностью.
Спасибо.
Таким образом, docker-compose — это просто замена для клиента docker-engine. Поддерживает паритет функций с клиентом. Для диагностики подобных проблем, вы должны отказаться от использования docker-compose, пока не начнете работать с обычным ole-клиентом. Исходя из ваших комментариев здесь и другого ответа, кажется, что вы не запускаете контейнер с процессом-демоном на переднем плане. Если вы хотите запустить интерактивную оболочку в Docker, вы должны использовать -it
флаги (-t
выделяет tty и -i
инициирует интерактивный сеанс). Если вы не запустите Docker с этими переключателями, ваш контейнер не выживет, если вы запустите интерактивную оболочку, например, php -a
,
Это помогает думать о Docker как об изящном способе запуска процесса, а не виртуальной машины. Это не какая-то «среда», существующая вне жизненного цикла любого процесса (и его дочерних элементов), который вы запускаете. Обычно PHP вызывается каким-либо сервером (например, Apache, Nginx и т. Д.). Здесь вы подразумеваете, что вам нужен PHP-процесс для запуска «навсегда», чтобы вы могли зайти в контейнер и протестировать некоторые вещи. За исключением интерактивной оболочки, это невозможно, и вам нужно специально использовать -it
Переключить, чтобы сохранить интерактивный процесс оболочки в вашем контейнере. Реальный ответ здесь заключается в том, что вы не можете делать то, что пытаетесь сделать здесь (поддерживать работающий контейнер PHP) без какого-либо связанного процесса демон / сервер, слушающего на переднем плане. Причина этого в том, что PHP работает не так. если ты действительно хотите попасть в контейнер из своего изображения PHP, просто поместите его в оболочку:
docker run -it apollo/php /bin/bash
… И вы запустите контейнер из своего изображения PHP и получите оболочку для контейнера (которая умрет, как только вы выйдете из оболочки). Но опять же, просто повторяя из моего первого абзаца, docker-compose — это не тот путь, по которому можно пойти сюда.
Если вы бежите с docker-compose up
и нет ошибок, напечатанных на терминале, тогда это предлагает, что сервис останавливается, потому что это закончено (в противоположность обнаружению некоторой ошибки).
Одной из возможных причин ошибки является то, что вы отправляете что-то в PHP (установка composer), что приведет к уничтожению интерактивного терминала php, который запускается php:5.6-cli
образ. Чтобы снова запустить интерактивную оболочку php, добавьте следующее в конец вашего Dockerfile:
CMD ["php", "-a"]
и попробуйте еще раз с docker-compose up
Примечание: когда все работает правильно, вы можете запустить docker-compose up -d
работать в режиме демона, снова давая вам контроль над вашим терминалом (все stdout + stderr будут записываться в соответствующие файлы журнала контейнера Docker).
Затем вы можете прикрепить к контейнеру, чтобы сделать свое дело. Я всегда находил это docker exec -it <containerID> bash
был быстрее чем docker attach <container id>
Надеюсь это поможет.
Если бы подобная проблема возникала с запуском оболочки zsh в контейнере Docker, работающем с compose, он закрывался бы с кодом выхода 0 сразу после запуска.
Комментарий Спока ниже последнего ответа на самом деле является ключом, по крайней мере, для того, что мне нужно.
Установите команду docker-compose для изображения:
command: tail -f /dev/null
Это поддерживает процесс в действии, но также позволяет его корректно завершить.