如何处理 Docker 中的状态 "Exit 0"

How to deal with state "Exit 0" in Docker

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

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 如果您想尝试一下,请访问存储库。

更新

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

更新 #1

我看不到这么奇怪的字符:

通常得到 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 查看日志。

查看您的存储库,您有

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

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

我查看了您的 Docker github 和 setup_php_settings 在线(第 27 行)有 source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

并且 运行s apache2 在前台所以它不应该以状态 code 0.

退出

但在我看来你的 setup_php_settings 包含一些奇怪的字符(当我 运行 你的图像与 compose 时) (原来是右边一个) weird character 我已经 将其更改为新行 并且对我有用。如果有帮助,请告诉我们。

如果您想调试 docker 容器,您可以 运行 它没有入口点,例如:

docker run -it yourImage bash


-- 经过一些调查:

当我重新启动 docker 容器时仍然有一些错误 - 就像你的情况停止容器并在重启后启动。有问题:符号链接已经存在并且 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 "$@"

这就是帮助我解决这个问题的原因: 在 docker-compose yaml 文件中的一项服务下,键入以下内容:

tty: true 所以看起来像

version: '3'

services: 
   web: 
     tty: true

希望这对某人有所帮助;对你有帮助的话点个赞:)