从Docker-compose php-apache退出,消息退出,代码为0

时间:2020-01-05 08:37:31

标签: php docker docker-compose

这个网站上有很多问题,但是没有一个给我解决方法。

我的dockerfile:

from php:7.2-apache

copy php.ini "$PHP_INI_DIR/php.ini"

copy symfony/ /var/www/html/
run chmod -R o+w /var/www/html/var/cache /var/www/html/var/logs /var/www/html/var/sessions

run docker-php-ext-install pdo_mysql opcache

copy exec.php /var/www/html/

我的docker-compose.yml文件:

version: '3'
services:
    web:
        build: .
        ports:
            - "8082:80"
        depends_on:
            - mysql
        command: ["php", "/var/www/html/exec.php"]
        #command: ["echo", "hello"]
    mysql:
        image: "mysql:5"
        environment:
            MYSQL_ROOT_PASSWORD: my-secret-pw

问题来自command键。当我注释命令时,php-apache / web运行。从docker ps可以看到容器。但是,当我添加command php-apache / web容器在php-apache_web_1 exited with code 0上死亡时,docker ps容器中存在{我可以与之互动。

有人从那个answer说容器退出了,因为命令完成了他的任务并退出了。但是我不希望我的服务器退出或死亡/杀死。如何防止命令不永久运行而返回退出状态?

如果您对我为什么运行命令感到好奇,那么我的命令几乎完全按照there的说明进行操作。

已编辑: 我想要的是一种解决方法,该方法可以使我的php apache服务器保持运行,并在php apache映像建立后在mysql服务器中创建数据库。

我根据建议的答案编辑了代码,但是mysql仍然以代码0退出:

dockerfile:

exec "$@"

docker-compose.yml文件:

from php:7.2-apache
copy php.ini "$PHP_INI_DIR/php.ini"

copy symfony/ /var/www/html/
run chmod -R o+w /var/www/html/var/cache /var/www/html/var/logs /var/www/html/var/sessions

run docker-php-ext-install pdo_mysql opcache

copy exec.php /var/www/html/

#using an sh script
copy run.sh /var/www/html/
run chmod u+x,g+x /var/www/html/run.sh

run.sh脚本:

version: '3'
services:
    web:
        build: .
        ports:
            - "8082:80"
        depends_on:
            - mysql
        command: ["/var/www/html/run.sh"]
    mysql:
        image: "mysql:5"
        environment:
            MYSQL_ROOT_PASSWORD: my-secret-pw

然后运行我在终端中执行的脚本:

#!/bin/sh
set -e

# Execute your custom scripts
php -f /var/www/html/exec.php

#End with running the original command
exec "$@"

3 个答案:

答案 0 :(得分:2)

为了在容器开始执行命令之前运行命令,可以使用自定义入口点。

#!/bin/sh
set -e

# Execute your custom scripts
php -f /var/www/html/exec.php

#End with running the original command
exec "$@"

有关更多信息,请查看official documentation for entrypoint

答案 1 :(得分:0)

您需要运行服务器并侦听特定端口,以保持应用程序运行(侦听传入的请求)。这就是保持服务器处于活动状态的原因,因为它可以接收请求。如果您的php文件有一个小任务,并且已经完成,则不需要熬夜。

因此,您需要拥有一台Web服务器,并且由于您使用的是纯PHP,因此您可能会发现this article useful about building web servers

对于您想要做的事情,有一个快速的技巧是使用-a标志以交互方式运行php。尝试在您的docker-compose文件中包含以下内容:

command: ["php", "-a", "/var/www/html/exec.php"]

答案 2 :(得分:0)

感谢拍拍回答,我能够使apache运行。

exec "$@"行对我不起作用。 "$@"是空白字符串。但是,由于他提供了How to process POST data in Node.js?,我发现运行apache服务所需的脚本是/usr/sbin/apache2ctl -D FOREGROUND。因此,我在脚本末尾写了exec "$@"而不是exec /usr/sbin/apache2ctl -D FOREGROUND

脚本现在是:

#run.sh
#!/bin/sh
set -e

# Execute your custom scripts
php -f /var/www/html/exec.php

#End with running the original command
exec /usr/sbin/apache2ctl -D FOREGROUND

查看link或运行docker inspect php:7.2-apache后,我发现ENTRYPOINT ["docker-php-entrypoint"]CMD ["apache2-foreground"]

因此,将我的脚本编辑为exec docker-php-entrypoint apache2-foreground,以确保图像脚本正确执行。