Docker:创建一个完全安装的PHP应用程序

时间:2019-02-27 23:01:10

标签: php wordpress docker docker-compose

我可以使用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应用程序一样,要完全安装,还需要设置一些其他配置字段,也需要一些其他数据库字段。

这意味着在wordpressdb容器都完全启动之前,我无法完全安装应用程序。我曾想过要解决一种变通办法,让我CMDENTRYPOINT等待建立数据库连接,但是基本的WordPress Dockerfile已经使用了ENTRYPOINTCMD,所以这不是一种选择。 (或者是吗?)

是否有一种优雅的,类似码头工人般的方式来做我想做的事情?还是我坚持告诉用户docker-compose up,然后运行第二条命令来完成安装?

4 个答案:

答案 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运行状况检查。这可能适合您的用例。

https://docs.docker.com/compose/compose-file/#healthcheck

答案 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 "$@"行之前的任何位置。