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