在构建时配置 PHP Apache Web 服务容器

在构建时配置 PHP Apache Web 服务容器

我正在建立一个PHP Apache Web 服务 Docker 容器原型。

  1. 第一个也是最简单的方法是使用官方发布的镜像创建一个容器WordPress
    简单Dockerfile来说:
FROM wordpress:latest

构建成功但运行失败:

# docker run -it wordpress_local apache2-foreground
WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
AH00534: apache2: Configuration error: No MPM loaded.

这是一个已知错误无法修复。因此图像破碎的.
其他类似的图像php7-apache2也会产生同样的错误。

  1. 无法找到可以实际运行的预构建映像,我开始从头开始构建映像。它包含
  • Alpine Linux 3.12
  • Apache 2.4
  • PHP 7.3

Dockerfile

# cat Dockerfile
FROM alpine:3.12
RUN apk add apache2 php7 php7-apache2 
ADD html/ /var/www/html/
WORKDIR /var/www/html/
CMD ["httpd", "-DNO_DETACH -DFOREGROUND -e debug"]

和一个docker-compose.yml

# cat docker-compose.yml
version: '3'
services:
  web:
    image: php_web_alpine
    build: .
    ports:
     - "8081:8081"

这构建得很好:

# docker build -t php_web_alpine .
Sending build context to Docker daemon  7.68 kB
Step 1/5 : FROM alpine:3.12
 ---> a24bb4013296
Step 2/5 : RUN apk add apache2 php7 php7-apache2
 ---> Using cache
 ---> bf59e0c43f1f
Step 3/5 : ADD html/ /var/www/html/
 ---> 0fe4bfd871b2
Removing intermediate container cec9de242174
Step 4/5 : WORKDIR /var/www/html/
 ---> 03d3fe0a077f
Removing intermediate container b1763eb3e56b
Step 5/5 : CMD httpd -DNO_DETACH -DFOREGROUND -e debug
 ---> Running in 4ca69abc9f52
 ---> e3a33ae6e028
Removing intermediate container 4ca69abc9f52
Successfully built e3a33ae6e028

但由于一个简单的配置错误

# docker-compose up 
Recreating phpalpine_web_1 ... done
Attaching to phpalpine_web_1
web_1  | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.20.0.2. Set the 'ServerName' directive globally to suppress this message
phpalpine_web_1 exited with code 0

只需用httpd.conf正确的值填充配置文件。

那么,我该如何填写 Web 服务配置文件(阿帕奇PHP以及其他人等...)在构建时间得到一个好的可重现的构建

答案1

没有什么比这更容易了,添加 复制指令到你的 Dockerfile。

它看起来会像这样:

COPY MyWebConf.conf /etc/apache2/sites-enabled/

它将复制并覆盖任何具有相同名称的现有配置。

如果您想在执行映像构建之前测试配置,请在容器的运行时将其挂载。

答案2

我想出了一个办法完全访问只是任何配置文件。

我根据有关数据库容器配置和构建的本教程开发了我的解决方案
MySQL 容器构建和配置

官方文档也提到:
Docker 卷配置和使用

这是一个多步骤工艺但只有在原始配置文件发生变化时才需要这样做。概念包括出口重新导入配置的配置文件位于容器构建时间

  1. 我创建了一个本地目录,用于将原始配置文件导出到该目录。
    $ mkdir config
    $ mkdir uploads/config -p
    $ vi Dockerfile
    RUN mkdir /home/uploads
    VOLUME /home/uploads
  1. 为了访问图像,我启动它,将本地目录安装到卷安装点
    (重要的是:Z能够在那里导出任何东西)
    # docker run  -it --entrypoint sh -v /absolute/path/uploads:/home/uploads:Z php_web_alpine
  1. 现在我可以访问配置目录并将我需要编辑的任何文件复制到导出目录
/var/www/html # cd /etc/ap*
/etc/apache2 # pwd
/etc/apache2
/etc/apache2 # ls -lah
total 188K   
drwxr-xr-x    1 root     root        4.0K Jul  7 11:30 .
drwxr-xr-x    1 root     root          62 Jul  7 11:33 ..
drwxr-xr-x    2 root     root        4.0K Jul  7 11:30 conf.d
-rw-r--r--    1 root     root       17.3K Jul  7 11:30 httpd.conf
-rw-r--r--    1 root     root       17.4K Apr  1 18:18 httpd.conf.save
-rw-r--r--    1 root     root       17.4K Jul  7 11:30 httpd.conf.setup.1
-rw-r--r--    1 root     root       17.3K Jul  7 11:30 httpd.conf.setup.2
-rw-r--r--    1 root     root       17.3K Jul  7 11:30 httpd.conf.setup.3
-rw-r--r--    1 root     root       12.8K Apr  1 18:18 magic
-rw-r--r--    1 root     root       59.4K Apr  1 18:18 mime.types
/etc/apache2 # cp httpd.conf /home/uploads/config/apache/
/etc/apache2 # cd conf.d
/etc/apache2/conf.d # ls -lah
total 40K    
drwxr-xr-x    2 root     root        4.0K Jul  7 11:30 .
drwxr-xr-x    1 root     root        4.0K Jul  7 11:30 ..
-rw-r--r--    1 root     root        2.2K Apr  1 18:18 default.conf
-rw-r--r--    1 root     root        1.2K Apr  1 18:18 info.conf
-rw-r--r--    1 root     root        5.0K Apr  1 18:18 languages.conf
-rw-r--r--    1 root     root        4.3K Apr  1 18:18 mpm.conf
-rw-r--r--    1 root     root         378 Jun 12 12:27 php7-module.conf
-rw-r--r--    1 root     root         732 Apr  1 18:18 userdir.conf
/etc/apache2/conf.d # cp mpm.conf /home/uploads/config/apache/
/var/www/html # cd /etc/php7
/etc/php7 # pwd
/etc/php7
/etc/php7 # mkdir /home/uploads/config/php/
/etc/php7 # cp php.ini /home/uploads/config/php/
/etc/apache2 # exit
  1. 导出后,我在本地目录中找到来自图像的配置文件,并可以将它们移动到配置目录中。容器构建
# cd config
# pwd
/apsolute/path/uploads/config
# ls -lah apache
insgesamt 28K
drwxr-xr-x. 2 user_name user_group   38 jul  7 12:45 .
drwxr-xr-x. 3 user_name user_group   19 jul  7 12:25 ..
-rw-r--r--. 1 root  root    18K jul  7 12:45 httpd.conf
-rw-r--r--. 1 root  root   4,4K jul  7 12:45 mpm.conf
# ls -lah php
insgesamt 72K
drwxr-xr-x. 2 root  root    20 jul  7 13:32 .
drwxr-xr-x. 4 user_name user_group  29 jul  7 13:33 ..
-rw-r--r--. 1 root  root   70K jul  7 13:32 php.ini
# mv apache ../../config/
# mv php ../../config/
# cd ../../config/
  1. 现在我可以完整、轻松、自然地编辑配置文件。
  2. 我包括配置的配置文件来Dockerfile构建一个完全配置的 Web 服务器容器
  • 考虑到配置文件可能会随着时间而改变,我将避免打击原始文件,无需保存副本。在每分钟转数.save使用扩展的样式
$ vi Dockerfile
COPY config/apache/httpd.conf /etc/apache2/httpd.conf.setup
COPY config/apache/mpm.conf /etc/apache2/conf.d/mpm.conf.setup
COPY config/php/php.ini /etc/php7/php.ini.setup
RUN cd /etc/apache2\
  && mv httpd.conf httpd.conf.save\
  && cp -f httpd.conf.setup httpd.conf
RUN cd /etc/apache2/conf.d\
  && mv mpm.conf mpm.conf.save\
  && cp -f mpm.conf.setup mpm.conf
RUN cd /etc/php7\
  && mv php.ini php.ini.save\
  && cp -f php.ini.setup php.ini
  1. 现在我可以安全地构建容器了
# docker build -t php_web_alpine .
Sending build context to Docker daemon 122.9 kB
Step 1/12 : FROM alpine:3.12
 ---> a24bb4013296
Step 2/12 : RUN apk add apache2 php7 php7-apache2
 ---> Using cache
 ---> bf59e0c43f1f
Step 3/12 : COPY MyWeb.conf /etc/apache2/sites-enabled/
 ---> Using cache
 ---> f38a0d067fdd
Step 4/12 : COPY config/apache/httpd.conf /etc/apache2/httpd.conf.setup
 ---> d29e5b94e1ab
Removing intermediate container 9efaed4b5da5
Step 5/12 : COPY config/apache/mpm.conf /etc/apache2/conf.d/mpm.conf.setup
 ---> 286100656541
Removing intermediate container 2cc1ebac920a
Step 6/12 : COPY config/php/php.ini /etc/php7/php.ini.setup
 ---> cb12fe5aa008
Removing intermediate container 7dd9bde72996
Step 7/12 : RUN cd /etc/apache2  && mv httpd.conf httpd.conf.save  && cp -f httpd.conf.setup httpd.conf
 ---> Running in d29ed8f6c3a1

 ---> dc1dcbc6adf6
Removing intermediate container d29ed8f6c3a1
Step 8/12 : RUN cd /etc/apache2/conf.d  && mv mpm.conf mpm.conf.save  && cp -f mpm.conf.setup mpm.conf
 ---> Running in 1667394701de

 ---> ecf4b961add4
Removing intermediate container 1667394701de
Step 9/12 : RUN cd /etc/php7  && mv php.ini php.ini.save  && cp -f php.ini.setup php.ini
 ---> Running in 55502cdfc2da

 ---> c32bfcb13c4a
Removing intermediate container 55502cdfc2da
Step 10/12 : ADD html/ /var/www/html/
 ---> c458eec870e2
Removing intermediate container 2359ebc7b630
Step 11/12 : WORKDIR /var/www/html/
 ---> 56790c506e0d
Removing intermediate container ef739299fb95
Step 12/12 : ENTRYPOINT httpd -DNO_DETACH -DFOREGROUND -e info
 ---> Running in cb6d5ff8b90c
 ---> e2abe6e4091a
Removing intermediate container cb6d5ff8b90c
Successfully built e2abe6e4091a

现在我可以启动它了,它运行顺利:

# docker-compose up -d
Recreating phpalpine_web_1 ... done
# docker-compose ps
        Name               Command                         State     Ports         
---------------------------------------------------------------------------------------
phpalpine_web_1            httpd -DNO_DETACH -DFOREGR ...   Up      0.0.0.0:8081->8081/tcp

我发现 Web 服务器已启动并正在运行:

# netstat -lpn|grep -i :80
tcp6       0      0 :::8081                 :::*                    LISTEN      31528/docker-proxy- 
# wget -S -O - "http://localhost:8081"
--2020-07-13 15:43:55--  http://localhost:8081/
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:8081... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Date: Mon, 13 Jul 2020 14:43:55 GMT
  Server: Apache/2.4.43 (Unix)
  X-Powered-By: PHP/7.3.19
  Content-Length: 0
  Keep-Alive: timeout=5, max=100
  Connection: Keep-Alive
  Content-Type: text/html; charset=UTF-8
Length: 0 [text/html]
Saving to: ‘STDOUT’

    [ <=>                                                       ] 0           --.-K/s   in 0s      

2020-07-13 15:43:55 (0,00 B/s) - written to stdout [0/0]

讨论

  • 我为什么想要出口原始配置文件?
    配置文件和包布局在不同的发行版中有很大不同。我可能没有正确的配置文件,因此服务的配置可能不符合预期。
  • 我为什么要保存构建时原始配置文件?
    在构建时,软件包可能会更新,某些更新可能会更改配置中的某些内容,就像经常发生的那样MySQL / MariaDB。为了解决任何问题,我需要能够与原始配置文件进行比较。

相关内容