Докеры готовят php-fpm и конфигурацию nginx
У меня небольшая теоретическая проблема с комбинацией php-fpm, nginx и кода приложения в Docker.
Я пытаюсь придерживаться модели, когда изображение докеров имеет только одно: у меня есть отдельные контейнеры для php-fpm и nginx.
php:
image: php:5-fpm-alpine
expose:
- 9000:9000
volumes:
- ./:/var/www/app
nginx:
image: nginx:alpine
ports:
- 3000:80
links:
- php
volumes:
- ./nginx/app.conf:/etc/nginx/conf.d/app.conf
- ./:/var/www/app
ПРИМЕЧАНИЕ. В app.conf указано root /var/www/app;
Пример схемы из Symfony
Это здорово в разработке, но я не знаю, как преобразовать это в готовое состояние производства. Установить каталог приложений в производстве - это действительно плохая практика (если я не ошибаюсь). В лучшем случае я копирую исходный код приложения в контейнер и использую этот предварительно построенный код (COPY . /var/www/app
in Dockerfile
), но в этом случае невозможно, или я не знаю, как это сделать.
Мне нужно использовать общий исходный код приложения между двумя контейнерами (контейнером nginx и контейнером php-fpm), потому что для него это необходимо.
Конечно, я могу создать собственный контейнер nginx и php-fpm и добавить COPY . /var/www/app
в оба из них, но я ошибаюсь, потому что я дублирую код и весь процесс сборки (устанавливаю зависимости, создаю исходный код и т.д.)...) должны быть в обоих контейнерах (nginx/php-fpm).
Я пытаюсь выполнить поиск, но я не знаю, как решить эту проблему. Многие статьи показывают, как сделать это с помощью файла docker-compose и кода монтирования с помощью --volume, но я не нашел никакого примера, как использовать это при создании (без тома).
Только одно приемлемое решение для меня (в это время) заключается в создании одного контейнера с nginx и php-fpm вместе, но я не уверен, когда это хороший способ (Я пытаюсь найти наилучшую практику).
Есть ли у вас опыт в этом или какая-либо идея, как его решить?
Спасибо за любой ответ!
Ответы
Ответ 1
В это время я использую smth вроде:
Dockerfile:
FROM php:fpm
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install
EXPOSE 9000
VOLUME /var/www/app/web
Dockerfile.nginx
FROM nginx
COPY default /etc/nginx/default
Докер-compose.yml
app:
build:
context: .
web:
build:
context: .
dockerfile: Dockerfile.nginx
volumes_from: app
Но через несколько дней релиза 17.05 мы можем сделать в одном файле Dockerfile, например:
FROM php:cli AS builder
COPY . /var/www/app/
WORKDIR /var/www/app/
RUN composer install && bin/console assets:dump
FROM php:fpm AS app
COPY --from=builder /var/www/app/src /var/www/app/vendor /var/www/app/
COPY --from=builder /var/www/app/web/app.php /var/www/app/vendo /var/www/app/web/
FROM nginx AS web
COPY default /etc/nginx/default
COPY --from=builder /var/www/app/web /var/www/app/web
Ответ 2
Многоступенчатая сборка не решает проблему.
Ответ 3
Я решаю проблему, создав общий том с помощью файла docker-compose:
version: '3'
volumes:
share_place:
services:
php:
image: php:5-fpm-alpine
ports:
- 9000:9000
volumes:
- share_place:/var/www/app
nginx:
image: nginx:alpine
ports:
- 3000:80
volumes:
- share_place:/var/www/app
Это создаст том share_place, который будет делиться данными между двумя контейнерами.