我已经构建了一个Docker镜像,然后使用Docker Compose运行一个容器。以下命令将为我完成这项工作:
docker-compose up -d
我已经重新启动了PC,现在我想启动之前创建的上一个容器。所以我尝试了以下命令:
$ 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>
并通过运行docker-compose up -d --build
重新创建它,则会再次运行。
更新#1
我无法看到这样奇怪的角色:
答案 0 :(得分:4)
我看了你的Docker github和setup_php_settings
在线(第27行)有source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND
并在前台运行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 "$@"
答案 1 :(得分:2)
正常情况下,获取exit 0
应该是值得庆祝的理由,因为它表明您的命令已成功结束(http://www.tldp.org/LDP/abs/html/exit-status.html)。
看了你的Dockerfile
之后,你只需在你的入口点调用bash
,然后肯定会退出(因为它是非阻塞的)。为了提供一些数据,您应该调用php
(这是一个阻止容器运行的阻塞操作),就像在php的官方docker文件中所做的那样(参见CMD ["php", "-a"]
at {{ 3}})
答案 2 :(得分:1)
您可以使用docker compose logs
检查日志。
通过您的回购,您有
ENTRYPOINT bash -C '/usr/local/bin/setup_php_settings';'bash'
,在没有交互式会话的情况下,bash会在读取stdin上的文件结尾后立即退出(退出代码为0)。
答案 3 :(得分:0)
这是帮助我解决此问题的原因: 在docker-compose yaml文件中的一项服务下,键入以下内容:
tty: true
看起来像
version: '3'
services:
web:
tty: true
希望这对某人有帮助;如果对您有帮助,会大大提高:)