我可以使用docker-compose
为完全安装的PHP应用程序创建一步设置吗?由于这是一个非常模糊的问题。我将以WordPress为例。
如果我查看the official wordpress docker repositories,我发现已经有一个超级有用的yml
文件用于docker-composer
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
这很棒,可以让我运行一个运行中的带有WordPress的前端应用服务器。它还获得一个数据库服务器。它设置了一切以便彼此交谈。太好了。
这没让我了解的是完全安装的 WordPress。像许多PHP应用程序一样,要完全安装,还需要设置一些其他配置字段,和也需要一些其他数据库字段。
这意味着在wordpress
和db
容器都完全启动之前,我无法完全安装应用程序。我曾想过要解决一种变通办法,让我CMD
或ENTRYPOINT
等待建立数据库连接,但是基本的WordPress Dockerfile已经使用了ENTRYPOINT
和CMD
,所以这不是一种选择。 (或者是吗?)
是否有一种优雅的,类似码头工人般的方式来做我想做的事情?还是我坚持告诉用户docker-compose up,然后运行第二条命令来完成安装?
答案 0 :(得分:2)
如果为问题中发布的docker-compose运行docker-compose up
之后,您有手动或通过脚本执行的其他步骤,则可以使用自己的图像修改原始的wordpress图像,以使其按预期工作为了满足您的业务需求,您需要做的就是开始编写一个新的Dockerfile
来生成新的自定义wordpress图片。因此,您可以执行以下操作作为示例:
FROM wordpress:5.1.0-php7.1-apache
COPY custom_docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["custom_docker-entrypoint.sh"]
CMD ["apache2-foreground"]
custom_docker-entrypoint.sh
代表需要完成的额外步骤。另外,您也可以在入口点脚本中引入新的环境变量,这样就可以使流程针对不同的客户端尽可能动态,而无需为每个客户端构建自定义映像。
生成的图像可以在您的docker-compose文件中使用,而不是在官方文件中使用
答案 1 :(得分:1)
您可能需要做的就是基于Wordpress图像创建自己的[{"number":2,"data":"DATA4"}]
{"firstArray":[{"data1":1,"data2":"DATA"},{"data1":2,"data2":"DATA2"}],"secondArray":[{"number":2,"data":"DATA4"}]}
,然后给他们自己的内容来运行。
我相信类似的东西应该起作用
docker-compose.yml
Dockerfile
./ docker / wordpress / Dockerfile
version: '3.1'
services:
wordpress:
build:
context: ./docker/wordpress
restart: always
ports:
- 8080:80
depends_on:
- "db"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
我只是简要地汇总了一下,因此并没有经过真正的测试,但是它应该为您提供总体思路和方向
答案 2 :(得分:1)
据我所知,MySQL映像具有其自己的启动脚本,该启动脚本在容器准备就绪后仍可以运行。此启动脚本可用于将数据导入数据库-MySQL连接仍然不会被接受,但是docket会认为您的数据库已准备就绪。
这对您意味着什么,如果由于某种原因db init脚本运行时间更长,它将停止php install命令的工作。
您可能需要实现一个轮询线程,该线程将等待数据库启动-然后才在php上运行安装脚本。
这是我发现的一篇文章,其中详述了类似的问题。
https://cweiske.de/tagebuch/docker-mysql-available.htm
也许还有其他一些技巧可能适合您的用例,但我需要了解更多上下文。
编辑:
检查docker运行状况检查。这可能适合您的用例。
答案 3 :(得分:1)
如果在容器启动后要运行某些命令,则有一种方法。我不知道这是否是在Docker中执行此操作的标准方法,但是它可以工作。
您已经知道wordpress图片有其自己的ENTRYPOINT,即脚本docker-entrypoint.sh
。
因此,您可以做的是将自定义命令放在此脚本中,该脚本将在wordpress容器启动时执行。
您可以按照以下步骤进行操作:
启动您的容器并复制现有内容
docker-entrypoint.sh
在容器外部创建一个新的docker-entrypoint.sh
并进行编辑
脚本将chmod命令添加到适当的位置。
在Dockerfile中添加一行以将此新入口点脚本复制到
位置/usr/local/bin/docker-entrypoint.sh
注意:
请勿将自定义命令放在脚本docker-entrypoint.sh
的末尾。您可以将其放在exec "$@"
行之前的任何位置。