从Docker编写php apache退出,消息退出,代码为0

从Docker编写php apache退出,消息退出,代码为0,php,docker,docker-compose,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 pd

在这个网站上有很多关于它的问题,但是没有一个能给我答案

我的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/
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
my 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
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
问题来自
命令
键。当我对命令进行注释时,
phpache
/
web
运行。从
docker ps
我可以看到集装箱。但是当我添加一个
命令时,
php apache
/
web
容器在
php-apache_web_1上死亡,代码为0
退出,它不会从
docker ps
显示,而
mysql
容器存在,我可以与它交互

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

如果您对我为什么运行命令感到好奇,那么我的命令几乎完全可以解释为什么

编辑:
我想要的是一个解决方案,解决如何保持我的php apache服务器运行,并在php apache映像构建完成后在mysql服务器中创建数据库的问题

我根据建议的答案编辑了代码,但
exec“$@”
仍以代码0退出:

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/
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
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
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
run.sh脚本:

#!/bin/sh
set -e

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

#End with running the original command
exec "$@"
然后运行我在终端中执行的脚本:

docker-compose down
docker-compose build
docker-compose up

您需要运行服务器并侦听某个端口,以保持应用程序运行(侦听传入的请求)。这就是保持服务器活动的想法,因为它接收请求。如果您的php文件有一个小任务,并且它已经完成了,那么它就不需要继续运行

因此,您需要的是一个web服务器,因为您使用的是纯php,您可能会发现

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

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

您需要运行服务器并侦听某个端口,以保持应用程序运行(侦听传入的请求)。这就是保持服务器活动的想法,因为它接收请求。如果您的php文件有一个小任务,并且它已经完成了,那么它就不需要继续运行

因此,您需要的是一个web服务器,因为您使用的是纯php,您可能会发现

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

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

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

#!/bin/sh
set -e

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

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

有关更多信息,请查看

,以便在容器开始执行其命令之前运行命令,您可以使用自定义入口点

#!/bin/sh
set -e

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

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

有关更多信息,请查看

,多亏了pat的回答,我才能够运行apache

exec“$@”
对我不起作用<代码>“$@”
是一个空白字符串。但是多亏了他提供的脚本,我找到了运行apache服务所需的脚本,它是
/usr/sbin/apache2ctl-D前台。因此,我在脚本末尾编写了
exec/usr/sbin/apache2ctl-D前台,而不是
exec“$@”

脚本现在是:

#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
在查看或运行
docker inspect php:7.2-apache
后,我发现
ENTRYPOINT[“docker php ENTRYPOINT”]
CMD[“apache2前台”]


因此,请将我的脚本编辑到exec docker php entrypoint apache2前台,以确保图像脚本正确执行。

多亏了pat answer,我才能够运行apache

exec“$@”
对我不起作用<代码>“$@”
是一个空白字符串。但是多亏了他提供的脚本,我找到了运行apache服务所需的脚本,它是
/usr/sbin/apache2ctl-D前台。因此,我在脚本末尾编写了
exec/usr/sbin/apache2ctl-D前台,而不是
exec“$@”

脚本现在是:

#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
在查看或运行
docker inspect php:7.2-apache
后,我发现
ENTRYPOINT[“docker php ENTRYPOINT”]
CMD[“apache2前台”]


因此,请将我的脚本编辑到exec docker php entrypoint apache2前台
,以确保图像脚本正确执行。

是否使用特定的web框架?我使用Symfony。但这不是问题所在。平心而论。我从命令行调用的php脚本是我编写的纯php脚本(无框架)。如果指定
命令:
,它将运行,而不是Dockerfile中的默认
CMD
。在这里显示的示例中,没有PHP Apache服务器可以继续运行,而是在运行数据库迁移脚本。@DavidMaze我完全忘记了这一点,Apache也在前台运行。谢谢你提醒我。帕特给我我想要的答案。@DavidMaze帕特的回答不起作用。运行命令后如何运行apache命令?您是否使用某个web框架?我使用Symfony。但这不是问题所在。平心而论。我从命令行调用的php脚本是我编写的纯php脚本(无框架)。如果指定
命令:
,它将运行,而不是Dockerfile中的默认
CMD
。在这里显示的示例中,没有PHP Apache服务器可以继续运行,而是在运行数据库迁移脚本。@DavidMaze我完全忘记了这一点,Apache也在前台运行。谢谢你提醒我。帕特给我我想要的答案。@DavidMaze帕特的回答不起作用。在运行命令之后如何运行apache命令?在这种情况下,您的答案不是很有用,因为apache将侦听传入的请求,即使没有运行PHP脚本。正如我提到的,如果我不运行任何命令,服务器仍在运行。它刚用c退出