Назад | Перейти на главную страницу

Настройка контейнера веб-службы PHP во время сборки

Я строю Контейнер веб-службы PHP Опытный образец.

  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. Не удалось найти готовый образ, который бы действительно запускался, я начал создавать образ с нуля. Это содержит

с 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 Файл конфигурации с правильными значениями.

Итак, как мне заполнить файлы конфигурации веб-службы (Apache и PHP и др. и т. д.) на Время сборки получить хороший воспроизводимая сборка ?

Я нашел способ получить Полный доступ чтобы просто любой Файл конфигурации.

Я разработал свое решение на основе этого руководства о настройке и сборке контейнера базы данных.
Сборка и настройка контейнера MySQL

Также из официальной документации по адресу:
Конфигурация и использование Docker Volumes

Это Многоступенчатый процесс но это необходимо сделать только при изменении исходного файла конфигурации. Концепция состоит из Экспорт и Реимпорт настроенных файлов конфигурации на Время сборки контейнера.

  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 построить Полностью настроенный контейнер веб-сервера
  • Имея в виду, что файлы конфигурации могут изменяться со временем, я избегать трепаться исходные файлы без сохранения копии. В хорошем Об / мин стиль с .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

Я обнаружил, что веб-сервер запущен и работает:

# 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. Чтобы устранить любую проблему, мне нужно иметь возможность сравнивать с исходными файлами конфигурации.

Нет ничего проще, добавьте КОПИРОВАТЬ директиву вашего Dockerfile.

это будет выглядеть примерно так:

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

Он скопирует и перезапишет любую существующую конфигурацию с тем же именем.

Если вы хотите протестировать конфигурацию перед выполнением сборки образа, подключите его во время выполнения контейнера.