Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.
Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.
Эта страница была переведена сообществом и не обязательно является актуальной. Обратитесь к справочной версии.
Docker-образы FrankenPHP основаны на официальных PHP-образах. Доступны варианты для Debian и Alpine Linux для популярных архитектур. Рекомендуется использовать Debian-варианты.
Доступны версии для PHP 8.2, 8.3 и 8.4.
Теги следуют следующему шаблону: dunglas/frankenphp:<frankenphp-version>-php<php-version>-<os>
.
<frankenphp-version>
и <php-version>
— версии FrankenPHP и PHP соответственно: от основных (например, 1
) до минорных (например, 1.2
) и патч-версий (например, 1.2.3
).<os>
может быть bookworm
(для Debian Bookworm) или alpine
(для последней стабильной версии Alpine).Создайте Dockerfile
в вашем проекте:
FROM dunglas/frankenphp
COPY . /app/public
Затем выполните следующие команды для сборки и запуска Docker-образа:
docker build -t my-php-app .
docker run -it --rm --name my-running-app my-php-app
Скрипт docker-php-extension-installer
включён в базовый образ. Установка дополнительных PHP-расширений осуществляется просто:
FROM dunglas/frankenphp
# Добавьте дополнительные расширения здесь:
RUN install-php-extensions \
pdo_mysql \
gd \
intl \
zip \
opcache
FrankenPHP построен на базе Caddy, и все модули Caddy можно использовать с FrankenPHP.
Самый простой способ установить пользовательские модули Caddy — использовать xcaddy:
FROM dunglas/frankenphp:builder AS builder
# Копируем xcaddy в образ сборки
COPY --from=caddy:builder /usr/bin/xcaddy /usr/bin/xcaddy
# Для сборки FrankenPHP необходимо включить CGO
RUN CGO_ENABLED=1 \
XCADDY_SETCAP=1 \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
CGO_CFLAGS=$(php-config --includes) \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" \
xcaddy build \
--output /usr/local/bin/frankenphp \
--with github.com/dunglas/frankenphp=./ \
--with github.com/dunglas/frankenphp/caddy=./caddy/ \
--with github.com/dunglas/caddy-cbrotli \
# Mercure и Vulcain включены в официальный билд, но вы можете их удалить
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy
# Добавьте дополнительные модули Caddy здесь
FROM dunglas/frankenphp AS runner
# Заменяем официальный бинарный файл на пользовательский с добавленными модулями
COPY --from=builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp
Образ builder
, предоставляемый FrankenPHP, содержит скомпилированную версию libphp
.
Образы builder доступны для всех версий FrankenPHP и PHP, как для Debian, так и для Alpine.
Tip
Если вы используете Alpine Linux и Symfony, возможно, потребуется увеличить размер стека.
Установите переменную окружения FRANKENPHP_CONFIG
, чтобы запускать FrankenPHP с Worker-скриптом:
FROM dunglas/frankenphp
# ...
ENV FRANKENPHP_CONFIG="worker ./public/index.php"
Для удобной разработки с FrankenPHP смонтируйте директорию с исходным кодом приложения на хосте как том в Docker-контейнере:
docker run -v $PWD:/app/public -p 80:80 -p 443:443 -p 443:443/udp --tty my-php-app
Tip
Опция
--tty
позволяет видеть удобочитаемые логи вместо JSON-формата.
С использованием Docker Compose:
# compose.yaml
services:
php:
image: dunglas/frankenphp
# раскомментируйте следующую строку, если хотите использовать собственный Dockerfile
#build: .
# раскомментируйте следующую строку, если вы запускаете это в продакшн среде
# restart: always
ports:
- "80:80" # HTTP
- "443:443" # HTTPS
- "443:443/udp" # HTTP/3
volumes:
- ./:/app/public
- caddy_data:/data
- caddy_config:/config
# закомментируйте следующую строку в продакшн среде, она позволяет получать удобочитаемые логи в режиме разработки
tty: true
# Томы, необходимые для сертификатов и конфигурации Caddy
volumes:
caddy_data:
caddy_config:
FrankenPHP поддерживает запуск под обычным пользователем в Docker.
Пример Dockerfile
для этого:
FROM dunglas/frankenphp
ARG USER=appuser
RUN \
# Для дистрибутивов на основе Alpine используйте "adduser -D ${USER}"
useradd ${USER}; \
# Добавьте возможность привязываться к портам 80 и 443
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/frankenphp; \
# Дайте права на запись для /data/caddy и /config/caddy
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
USER ${USER}
Даже при запуске без root-прав, FrankenPHP требуется возможность CAP_NET_BIND_SERVICE
для привязки веб-сервера к зарезервированным портам (80 и 443).
Если вы открываете доступ к FrankenPHP на непривилегированном порту (1024 и выше), можно запустить веб-сервер от имени обычного пользователя без необходимости предоставления дополнительных возможностей:
FROM dunglas/frankenphp
ARG USER=appuser
RUN \
# Для Alpine-дистрибутивов используйте команду "adduser -D ${USER}"
useradd ${USER}; \
# Удалите стандартные возможности
setcap -r /usr/local/bin/frankenphp; \
# Дайте права на запись для /data/caddy и /config/caddy
chown -R ${USER}:${USER} /data/caddy && chown -R ${USER}:${USER} /config/caddy
USER ${USER}
Затем установите переменную окружения SERVER_NAME
, чтобы использовать непривилегированный порт.
Пример: :8000
.
Docker-образы обновляются:
Версии для разработки доступны в Docker-репозитории dunglas/frankenphp-dev
.
Сборка запускается автоматически при каждом коммите в основную ветку GitHub-репозитория
Теги с префиксом latest*
указывают на актуальное состояние ветки main
.
Также доступны теги в формате sha-<git-commit-hash>
.