这个网站上有很多问题,但是没有一个给我解决方法。
我的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 "$@"
答案 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
,以确保图像脚本正确执行。