Поддержание контейнера в рабочем состоянии и связывание с помощью docker-compose

Я хочу использовать 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

Любая помощь будет принята с благодарностью.

Спасибо.

8

Решение

Таким образом, 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 — это не тот путь, по которому можно пойти сюда.

10

Другие решения

Если вы бежите с 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>

Надеюсь это поможет.

5

Если бы подобная проблема возникала с запуском оболочки zsh в контейнере Docker, работающем с compose, он закрывался бы с кодом выхода 0 сразу после запуска.

Комментарий Спока ниже последнего ответа на самом деле является ключом, по крайней мере, для того, что мне нужно.

Установите команду docker-compose для изображения:

command: tail -f /dev/null

Это поддерживает процесс в действии, но также позволяет его корректно завершить.

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