Как использовать docker-compose yml файл для производства? - PullRequest
0 голосов
/ 10 октября 2018

У меня на локальном хосте есть докер-приложение, которое работает нормально.Я использую PHP, Nginx и Mariadb.

Это шаблон докера, который я использую: https://github.com/matchish/skeleton

В вышеприведенном репо есть только один файл docker-compose.yml, который содержит этот код:

version: '3'

services:
    db:
      build:
        context: ./mariadb
      volumes:
          - "./.data/db:/var/lib/mysql"
          - "./logs/mariadb:/var/log/mysql"
      environment:
          MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
          MYSQL_DATABASE: ${MYSQL_DATABASE}
          MYSQL_USER: ${MYSQL_USER}
          MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      networks:
        - default
    php-fpm:
      build:
          context: ./php7-fpm
          args:
              TIMEZONE: ${TIMEZONE}
      volumes:
          - ${APP_PATH}:/var/www/app
      environment:
          DB_HOST: db
          DB_PORT: 3306
          DB_DATABASE: ${MYSQL_DATABASE}
          DB_USERNAME: ${MYSQL_USER}
          DB_PASSWORD: ${MYSQL_PASSWORD}
      depends_on:
        - db
      networks:
        - default
    nginx:
      build:
        context: ./nginx
        args:
          - 'php-fpm'
          - '9000'
      volumes:
        - ${APP_PATH}:/var/www/app
        - ./logs/nginx/:/var/log/nginx
      ports:
        - "80:80"
        - "443:443"
      depends_on:
        - php-fpm
      networks:
        - default
networks:
  default:
    driver: bridge

Сначала я подумал, что требуется только один файл компоновки, и когда я построил образ, передал его в докер-концентратор, а затем вытащил этот образ на моем рабочем сервере, контейнер не запустился.

Я кое-что прочитал, и есть много интернет-источников, предлагающих использовать от 1 до 4 файлов Docker и проверить две ветки Git ... среди прочего ...

Я понимаючто я должен по крайней мере создать еще один файл с именем docker-compose-prod.yml, и в этом файле я должен опустить атрибуты volumes: и port:, но, похоже, нет четкого руководства:

  1. как заставить докер работать на локальном

  2. точно, когда и как собрать контейнер для производства.

Может кто-нибудь прояснить это для меня, пожалуйста?

1 Ответ

0 голосов
/ 10 октября 2018

Рекомендуется использовать Multiple Compose files:

Использование нескольких файлов Compose позволяет настроить приложение Compose для различных сред или различных рабочих процессов.

Далее идетпример:

(ПРИМЕЧАНИЕ: далее опустите некоторые элементы файла составления)

docker-compose.yml:

web:
  image: example/my_web_app:latest

docker-compose.dev.yml:

web:
  ports:
    - 80:80
  • Выполнить docker-compose -f docker-compose.yml -d не будет иметь карты портов.
  • Выполнить docker-compose -f docker-compose.yml -f docker-compose.dev.yml -d заставит docker-compose.dev.yml переопределить некоторыезначение docker-compose.yml, которое определяет ваши цели.

Подробнее см. докерская документация , это официальное предложение для обработки вашего сценария, к вашему сведению.

ОБНОВЛЕНО:

Вы используете build: context: ./mariadb, поэтому compose всегда может найти Dockerfile в папке mariadb для сборки, независимо от того, на локальном сервере dev или prod server.

Чуть выше будет сборка образа на сервере dev и prod, это один вариант для вас.

Другой вариант, как вы сказали в comments:

Но на Prod-сервере я могу только вытащить и запустить образ, и образ должен быть заранее создан с помощью файла prod yml

Так что вы можетене хотите снова создать образ на prod сервере?

Затем следующее обновленное решение, просто пример:

docker-compose.yml:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default

docker-compose.dev.yml:

db:
  build:
    context: ./mariadb
  ports:
    - "xxx:xxx"

docker-compose.prod.yml:

db:
  otheroptions_special_for_prod_just_a_example: xxx

1) docker-compose -f docker-compose.yml -f docker-compose.dev.yml -d

Это будет объединено следующим образом:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default
  build:
    context: ./mariadb
  ports:
    - "xxx:xxx"

В соответствии с синтаксисом docker-compose, если build:context был предоставлен, compose не будет извлекать образ Docker из реестра Docker, просто найдите Dockerfile в context и, наконец, создайте образ с именем, указанным в image, здесь это your_maridb_image_name:your_maridb_image_version.

Затем вам нужно нажать на него dockerhub, но вам нужно остановить локальный контейнер.

2) docker-compose -f docker-compose.yml -f docker-compose.prod.yml -d

Это будет комбинироваться следующим образом:

db:
  image: your_maridb_image_name:your_maridb_image_version
  networks:
    - default
  otheroptions_special_for_prod_just_a_example: xxx

Синтаксис docker-compose, build:context не был предоставлен, поэтому compose будет напрямую извлекать образ из удаленного реестра (концентратор докеров), помнитеВы отправили образ в dockerhub после того, как закончили разработку на локальном сервере dev?Поэтому нет необходимости строить изображение заново.

...