фиксация докера после создания докера

#docker #docker-compose #amazon-ecr

Вопрос:

Я запускаю docker compose следующим образом:

 docker-compose -f docker-compose.dev.yml up --build -d
 

содержимое docker-compose.dev.yml является:

 version: '3'

services:

  client:
    container_name: client
    build:
      context: frontend
    environment:
      - CADDY_SUBDOMAIN=xxx
      - PRIVATE_IP=xxx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    links:
      - express
    volumes:
      - /home/ec2-user/.caddy:/root/.caddy

  express:
    container_name: express
    build: express
    environment:
      - NODE_ENV=development
    restart: always
 

Затем я хочу создать изображения из этих контейнеров, чтобы использовать их на тестовом сервере, отправив их в aws ECR и подключив тестовый сервер, чтобы избежать повторного создания докеров. Простое использование фиксации docker не сработало.

каков правильный подход к созданию изображений из выходных данных docker compose?

Спасибо

Комментарии:

1. В общем, правильный подход к созданию изображений заключается в использовании файла Dockerfile. Использование docker commit для сохранения «живых» изменений приводит к тому, что изображение трудно воспроизвести (нет записи о том, как оно было создано).

2. «Простое использование фиксации docker не сработало». Что случилось, когда ты попытался? Были ли ошибки, или полученные изображения оказались не такими, как вы ожидали?

3. @larsks в основном не был в сети, не выглядел тогда диппером. динт хочет тратить время на попытки исправить маленькие дырочки, когда я не уверен, что нахожусь на верном пути.

Ответ №1:

Вы в принципе никогда не должны использовать docker commit . Стандартный подход состоит в том, чтобы описать, как создавать изображения с помощью файла Dockerfile, и проверить этот файл в системе управления версиями. Вы можете поместить созданный образ в реестр, такой как Docker Hub, и вы можете проверить исходный исходный код и восстановить образ.

Хорошей новостью является то, что у вас в основном уже есть эта настройка. Каждая из ваших служб создания имеет build: блок, содержащий данные о том, как создать изображение. Так что этого достаточно, чтобы

 docker-compose build
 

и вы получите отдельный образ докера для каждого компонента.

Часто, если вы делаете это, вам также захочется перенести изображения в какой-нибудь реестр Docker. В настройке создания вы также можете указать значение image: для каждой службы. Если у вас есть и build: то , и image: другое, это указывает имя изображения, которое будет использоваться для построенного изображения (в противном случае Compose выберет одно из них на основе имени проекта).

 version: '3.8'
services:
  client:
    build:
      context: frontend
    image: registry.example.com/project/frontend
    et: cetera
  express:
    build: express
    image: registry.example.com/project/express
    et: cetera
 

Затем вы можете создать как сборку, так и отправку изображений

 docker-compose build
docker-compose push
 

Один из последних методов, который может быть полезен, состоит в том, чтобы разделить настройку создания на два файла. В главном docker-compose.yml файле есть настройки, необходимые для запуска набора контейнеров в любой системе с доступом к реестру контейнеров. Отдельный docker-compose.override.yml файл будет поддерживать использование разработчиком, если у вас также есть копия исходного кода. Если вы используете Compose для развертывания, вам нужно только скопировать основной docker-compose.yml файл в целевую систему.

 # docker-compose.yml
version: '3.8'
services:
  client:
    image: registry.example.com/project/frontend
    ports: [...]
    environment: [...]
    restart: always
    # volumes: [...]
  express:
    image: registry.example.com/project/express
    ports: [...]
    environment: [...]
    restart: always
 
 # docker-compose.override.yml
version: '3.8'
services:
  client:
    build: frontend
    # all other settings come from main docker-compose.yml
  express:
    build: express
    # all other settings come from main docker-compose.yml