2016-10-18 18 views
2

У меня есть изображение Докера, а затем запускаем контейнер с помощью Docker Compose. Следующая команда будет делать эту работу для меня:Как справиться с состоянием «Выход 0» в Docker

docker-compose up -d 

Я перезагрузил компьютер и теперь я хочу, чтобы запустить предыдущий контейнер, который я создал раньше. Так что я попробовал следующую команду:

$ docker-compose start 
Starting php-apache ... done 

Видимо это работает, но это не так на выходе для следующей команды:

$ docker-compose ps 
      Name       Command    State Ports 
--------------------------------------------------------------------------- 
php55devwork_php-apache_1 /bin/sh -c bash -C '/usr/l ... Exit 0   

Наверняка что-то не так, и я пытаюсь найти вне какой.

  • Как узнать, почему команда не работает?
  • Есть ли место, где я могу увидеть файл журнала или что-то, что поможет мне определить и исправить ошибку?

Here is репозиторий, если вы хотите попробовать.

Update

Если удалить контейнер: docker rm <container-id> и воссоздать его, запустив docker-compose up -d --build он снова работает.

Update # 1

Я не в состоянии видеть такие странные символы:

enter image description here

ответ

3

Я посмотрел в вашу Докер GitHub и setup_php_settings на линии (линия п. 27) есть source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

и работает apache2 на переднем плане, поэтому он не должен выйти со статусом code 0.

Но мне кажется, как ваш setup_php_settings содержит некоторые странный характер (когда я бег изображения с композом) (оригинал один на правой стороне) weird character меня изменил его на новые линии и ему работал на меня. Сообщите нам, помогло ли это.

Если вы хотите отлаживать Docker контейнер вы можете запустить его без EntryPoint как:

docker run -it yourImage bash


- после некоторого исследования:

Были еще некоторые ошибки при перезагрузке контейнера докеров - например, в вашем случае остановился контейнер и начнется после перезагрузки. Были проблемы: символические ссылки уже существуют, а apache2 имеет грубый PID, поэтому нам нужно сделать что-то вроде oficial php docker

Это полный setup_php_settings работал для меня после перезагрузки контейнера.

#!/bin/bash -x 
set -e 

PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL & ~E_DEPRECATED & ~E_NOTICE"} 
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/apache2/php.ini 
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php5/cli/php.ini 
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/apache2/php.ini 
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php5/cli/php.ini 
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/apache2/php.ini 
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php5/cli/php.ini 

mkdir -p /data/tmp/php/uploads 
mkdir -p /data/tmp/php/sessions 
mkdir -p /data/tmp/php/xdebug 

chown -R www-data:www-data /data/tmp/php* 

ln -sf /etc/php5/mods-available/zz-php.ini /etc/php5/apache2/conf.d/zz-php.ini 
ln -sf /etc/php5/mods-available/zz-php-directories.ini /etc/php5/apache2/conf.d/zz-php-directories.ini 

# Add symbolic link to get Zend out of the current install dir 
ln -sf /usr/share/php/libzend-framework-php/Zend/ /usr/share/php/Zend 

a2enmod rewrite 
php5enmod mcrypt 

# Apache gets grumpy about PID files pre-existing 
: "${APACHE_PID_FILE:=${APACHE_RUN_DIR:=/var/run/apache2}/apache2.pid}" 
rm -f "$APACHE_PID_FILE" 

source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND "[email protected]" 
+0

Это странно. Я не вижу их, какой инструмент вы использовали? Я работаю в Fedora с помощью редактора Atom. Что касается ошибок, они должны остановить контейнер с самого начала? – ReynierPM

+1

Я обновил OP с изображением, я не могу видеть эти странные символы – ReynierPM

+0

TurtoiseGit, но я нахожусь в Windows. Как я понял, вы поняли это, но это странно. – VladoDemcak

1

Обычно получаю сообщение об exit 0 должна быть причина, чтобы праздновать, как это указывает на то, что ваша команда имеет (http://www.tldp.org/LDP/abs/html/exit-status.html).

Если вы посмотрите на ваш Dockerfile, это будет выглядеть так, как только вы вызываете bash в свою точку входа, которая точно выйдет (поскольку она не блокируется). Для того, чтобы служить некоторые данные, вы должны скорее называть php (это блокирующая операция, которая держит контейнер вверх), как сделано в официальных документах докеров для PHP (см CMD ["php", "-a"] на https://github.com/docker-library/php/blob/1c56325a69718a3e3cf76179e75d070b7e23da62/5.6/Dockerfile)

+0

Должен ли я изменить свой 'ENTRYPOIN'T быть' Entrypoint Баш -C '/ USR/местные/бен/setup_php_settings'; 'PHP -a'' вместо этого? Это вы сказали? – ReynierPM

+0

Jup, но обязательно попробуйте то, что узнал VladoDemcak. – gtonic

1

Вы можете проверить журналы с docker compose logs.

Глядя через репо, у вас есть

ENTRYPOINT bash -C '/usr/local/bin/setup_php_settings';'bash' 

, который без интерактивной сессии, баш будет немедленно выйти (с кодом выхода 0) после прочтения конца файла на стандартный ввод.

+0

Я считаю, что это проблема, но я не знаю, как ее исправить, не могли бы вы помочь мне решить эту проблему? Я начинаю изучать Docker :-) – ReynierPM

+0

Точка входа не должна выходить, поэтому 'ENTRYPOINT/usr/local/bin/setup_php_settings && sleep infinity' может работать. – BMitch