从Docker编写php apache退出,消息退出,代码为0
在这个网站上有很多关于它的问题,但是没有一个能给我答案 我的dockerfile:从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
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退出