You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.4 KiB

LE_PHP_Docker

Контейнер заточен для LE_Framework, выполняет функционал php-fpm

  • php 7.4.22
  • json, xml, zip, freetype, curl, bcmatch, mysqli
  • поддержка RabbitMQ (amqp)
  • пропатченная локаль, месяца с маленькой буквы и в родительном падеже
  • отправка почты через ssmtp

Установка

mkdir php_le_docker;
cd php_le_docker;
wget https://raw.githubusercontent.com/TechResearchRu/LE_PHP_Docker/main/Dockerfile
docker build -t php-le .

Запуск

Если нужно просто поиграться в терминале

docker run -it --rm php-le /bin/sh

Продакшн режим примерно такой (но без поддержки php sendmail), по настройке sendmail из контейнера смотрите раздел ниже

docker run -d \
--restart=always \
--name project1.ru \
-p 127.0.0.1:9000:9000 \
-v /www:/www \
php-le

Настройка почты

Сперва на локальном компе сделаем конфиг, который прокинем

mkdir -p /docker_conf/etc/ssmtp/
nano /docker_conf/etc/ssmtp/ssmtp.conf

Вставим примерно такое

#see ptr
rewriteDomain=web.mydomain.ru
FromLineOverride=YES
#host ip, see "ip addr|grep docker0"
mailhub=172.17.0.1
UseTLS=YES
UseSTARTTLS=YES

Нужно прописать на ip вашего сервера PTR запись у хостера или провайдера и на эту обратную запись настроить postfix, в примере это web.mydomain.ru, проверить ваш обратный адрес можно так nslookup 8.8.8.8, в примере выше есть ip 172.17.0.1, это IP моста в докере, его можно узнать так: ip addr | grep docker0

Далее настраиваем Postfix на хосте.

При подобном методе есть вероятность полететь в спам, если у вас несколько разных сайтов с разных доменов будут отправлять, поэтому в Postfix нужно прописать следующее

#тут хак для подмены отправителя из докеров
sender_canonical_classes = envelope_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps

и еще создать файлик /etc/postfix/sender_canonical_maps и прописать в него

/.+/    postmaster@web.mydomain.ru

Запуск контейнера с настройками sendmail


Про даты

Обычно PHP берет из локали название месяца и оно там в именительном падеже

01 август 2021

Но нам нужно вот так

01 августа 2021

В данном контейнере скомпилированы локали с патчами на русский язык. Проверить можно примерно вот так:

if(setlocale(LC_ALL, 'ru_RU.UTF-8','Russian_Russia.65001')===false) 
        exit('not find UTF-8 LOCALE');
if(setlocale(LC_NUMERIC, 'en_US.UTF-8', 'C.UTF-8','C')===false) 
        exit('not find C NUMERIC LOCALE');

// 01 августа 2021
echo strftime('%d %B %Y', time());