Docker-compose: заменить сервис на основе "build" на готовый образ в производстве? - PullRequest
0 голосов
/ 22 декабря 2018

Допустим, у нас есть следующее docker-compose.yml:

version: '3'
services:
  db:
    image: "postgres"
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_PASSWORD=mysecretpassword
  web:
    build: web
    depends_on: [ db ]
    ports:
     - "80:80"

Первый сервис, db, просто запускает контейнер с официальным образом postgres из Docker Hub.

Второй сервис, web, сначала создает новый образ на основе Dockerfile в папке, также называемой web, затем запускает контейнер с этим образом.

Во время разработкиТеперь мы можем (неоднократно) вносить изменения в то, что находится в папке web, а затем запустить docker-compose up --build, чтобы запустить наше приложение локально.

Допустим, теперь мы хотим развернуть в производство.Насколько я понимаю, docker-compose.yml теперь можно использовать для «определения стека в режиме роя Докера» (см., Например, этот ответ).Однако для шага build службы web документация для докера compose file *1023* гласит, что

Эта опция игнорируется при развертывании стека в режиме роя с (Версия 3) Составьте файл.Команда стека docker принимает только предварительно созданные образы.

Вероятно, в любом случае было бы не очень хорошей идеей создавать образ на производственном компьютере, так как это оставило бы артефакты сборки (исходный код) позади.;это должно происходить на сервере сборки.

Мой вопрос: есть ли рекомендуемый способ изменить docker-compose.yml на пути к производству, чтобы как-то поменять build: web на image: <id>?

Ничего на Используйте Compose в производстве на этом.Что-то не так с моим подходом в целом?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

docker-compose.yml должен содержать только определения канонических услуг.

Все, что относится к среде сборки (например, dev vs prod), должно быть объявлено в отдельном файле docker-compose.override.yml.Каждая среда сборки может иметь свою собственную версию этого файла.

Объявление build: web не относится к docker-compose.yml, так как предполагается, что оно выполняется только локально (и, возможно, на сервере сборки), а не вproduction.

Таким образом, в приведенном выше примере это будет выглядеть так: docker-compose.yml:

version: '3'
services:
  db:
    image: "postgres"
    ports:
     - "5432:5432"
    environment:
     - POSTGRES_PASSWORD=mysecretpassword
  web:
    depends_on: [ db ]
    ports:
     - "80:80"

И это будет значение по умолчанию docker-compose.override.yml для локальной разработки:

version: '3'
services:
  web:
    build: web

Запуск docker-compose up --build -d теперь создает последние изменения кода и запускает наше приложение локально.

Также может быть другая версия docker-compose.override.build.yml, предназначенная для сервера сборки / CI:

version: '3'
services:
  web:
    build: web
    image: mydockeruser/web

Запуск docker-compose -f docker-compose.yml -f docker-compose.override.build.yml push создаст последние изменения кода и отправит образ в его реестр / хранилище.

Наконец, может быть другая версия docker-compose.override.prod.yml:

version: '3'
services:
  web:
    image: mydockeruser/web

Развертывание в рабочей среде (только на одном хосте Docker, а не в кластере) теперь может быть таким же простым, как копирование только docker-compose.yml и docker-compose.override.prod.yml и запуск docker-compose -f docker-compose.yml -f docker-compose.override.prod.yml up -d.

0 голосов
/ 22 декабря 2018

Правильный способ сделать это (т. Е. Способ, которым я делаю это: P) - это иметь разные файлы для создания docker;например, docker-compose.dev.yml и docker-compose.prod.yml.Затем вы можете отправить готовый к работе образ в репозиторий, например, Docker Hub , и ссылаться на это изображение в docker-compose.prod.yml web сервисе.В то же время вы можете использовать файл dev docker-compose (файл с опцией build) для локальной разработки.

Кроме того, если вы об этом подумали, вы не можете использовать переменные env в качестве ключейв docker-compose (см. здесь ).Таким образом, нет возможности условно установить параметры image или build.

...