如何在Docker中处理状态“Exit 0”

我已经构build了一个Docker镜像,然后使用Docker Compose运行一个容器。 以下命令将为我完成这项工作:

docker-compose up -d 

我已经重新启动了PC,现在我想启动之前创build的以前的容器。 所以我试了下面的命令:

 $ 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 

肯定有什么地方是错的,我正试图找出什么。

  • 我如何find命令失败的原因?
  • 有没有什么地方可以看到日志文件或者什么东西可以帮助我识别和修复错误?

这是存储库,如果你想尝试一下。

更新

如果我删除了容器: docker rm <container-id> ,并通过运行docker-compose up -d --build重新创build它docker-compose up -d --build它再次工作。

更新#1

我无法看到这样怪异的字符:

在这里输入图像说明

我看了一下你的Docker github和setup_php_settings在线(第27行), source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

并且在前台运行apache2 ,所以它不应该以状态code 0退出。

但在我看来,像你的setup_php_settings包含一些怪异的字符(当我运行你的图像撰写) (原来是一个右侧) 怪异的字符我已经改变了新的行 ,它为我工作。 让我们知道是否有帮助。

如果你想debugging你的docker容器,你可以运行它没有入口点,如:

docker run -it yourImage bash


– 经过一番调查:

当我重启Docker容器时,仍然有一些错误 – 就像在你的情况停止容器,并重新启动后启动。 有问题:符号链接已经存在和apache2脾气暴躁的PID,所以我们需要做一些像在php 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 "$@" 

正常情况下, exit 0应该是一个值得庆祝的理由,因为它表明您的命令已经成功结束( http://www.tldp.org/LDP/abs/html/exit-status.html )。

看看你的Dockerfile ,看起来像,你只需在你的入口点调用bash ,然后肯定会退出(因为它是非阻塞的)。 为了提供一些数据,你应该调用php (这是一个阻止容器运行的操作),就像在php官方的docker文件中所做的一样(参见CMD ["php", "-a"] https://github.com/docker-library/php/blob/1c56325a69718a3e3cf76179e75d070b7e23da62/5.6/Dockerfile

您可以使用docker compose logs来检查docker compose logs

看你的回购,你有

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

在没有交互式会话的情况下,bash将在读取stdin上的文件结尾后立即退出(退出代码为0)。