Создайте образ с php и используйте его в производстве с docker -compose - PullRequest
0 голосов
/ 16 июня 2020

Я начинаю с Docker и думаю, что упускаю кое-что совершенно очевидное. У меня есть действительно простой многоэтапный Dockerfile, который выглядит так:

FROM php:7.4-fpm-alpine as test_php
WORKDIR /app
COPY . .
CMD ["php-fpm"]

FROM nginx:1.19-alpine as test_nginx
COPY docker/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
WORKDIR /app
COPY --from=test_php /app/public public/

И docker -compose, который выглядит так:

services:
  php:
    build:
      context: .
      target: test_php
    volumes:
      - ./:/app

  nginx:
    build:
      context: .
      target: test_nginx
    depends_on:
      - php
    volumes:
      - ./docker/nginx/conf.d:/etc/nginx/conf.d
      - ./public:/app/public
    ports:
      - "80:80"

Это работает в разработке (у меня в папке publi c просто индекс. php с помощью phpinfo ()). В моем default.conf для nginx есть это:

fastcgi_pass php:9000;

, чтобы создать ссылку на службу php.

Проблема в производстве. Я создаю свой образ на основе Dockerfile, а затем отправляю sh его в Docker Hub. Чтобы использовать свой образ в продакшене, я хотел сделать что-то вроде этого в новом docker -compose.prod.yml:

services:
  app:
    image:mynickname/myimage

Итак, теперь я использую свой образ, созданный в файле докеров, но я этого не делаю. У меня больше нет службы php, поэтому nginx conf больше не работает. Я думал оставить свой исходный docker -compose (с услугой php), но в этом случае я не использую свое изображение ... Я явно что-то пропустил, поэтому мой вопрос:

Что это "лучший" способ go от разработчика к продукту с такой базовой конфигурацией c? (php и nginx). Как я могу использовать свое изображение в производстве, если php работает нормально? Есть ли другие способы?

Большое спасибо за вашу помощь

1 Ответ

2 голосов
/ 17 июня 2020

Вашим первым шагом (все еще в среде разработки) должно быть удаление volumes:, которое перезаписывает код изображения. Внедрение конфигурации nginx для каждого развертывания является разумным; перезапись того, что вы COPY в содержимом хоста, означает, что вы фактически не тестируете то, что собираетесь развернуть.

Данная служба Compose может иметь как build:, так и ан image:. В этом случае Compose пометит создаваемый образ с именем, которое вы ему даете, вместо того, чтобы выбирать собственное имя, а затем вы можете docker-compose push созданные образы в реестр.

Наконец, когда вы go запускаете эту установку в другом месте, вы можете удалить блоки build:, и Compose вытащит image:, которые ему нужны. В результате docker-compose.yml будет примерно выглядеть так:

version: '3'
services:
  php:
    # build:
    #   context: .
    #   target: test_php
    image: mynickname/php
  nginx:
    # build:
    #   context: .
    #   target: test_nginx
    image: mynickname/nginx
    depends_on:
      - php
    volumes:
      - ./docker/nginx/conf.d:/etc/nginx/conf.d
    ports:
      - "80:80"

Вы также можете настроить это с помощью нескольких docker-compose.yml файлов , где "стандартный" docker-compose.yml файл имеет производственную версию. (включая image:), и это расширяется с помощью docker-compose.override.yml, который добавляет объявления build:. В производственной установке вы должны скопировать только базовый файл в целевую систему.

...