Почему создается moby/buildkit:buildx-stable-1, когда я пытаюсь собрать, что приводит к конфликту имен контейнера?

Вопрос или проблема

У меня есть следующий docker-compose…

version: "3.8"
services:
  proxy:
    container_name: proxy
    extra_hosts:
      - "host.docker.internal:host-gateway"
    build:
      context: proxy
      dockerfile: Dockerfile
    volumes:
      - ./proxy/certificate:/usr/cert
    ports:
      - "443:443"
  ui:
    container_name: ui
    restart: always
    build:
      context: frontend
    ports:
      - "80:80"
  backend:
    container_name: backend
    restart: always
    build:
      context: backend
    ports:
      - "8000:8000"
    environment:
      - API_KEY
      - GOLD_TOKEN

Затем я использую следующий Shell-скрипт для сборки…

#! /bin/bash
docker-compose build
docker-compose up -d

Но когда я запускаю Shell-скрипт, он пытается создать контейнер moby/buildkit:buildx-stable-1. Этот контейнер не удается создать, и я получаю следующую ошибку в сборке…

 => ERROR [internal] booting buildkit                                                                                                                                  0.9s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                                                     0.8s
 => => creating container buildx_buildkit_gallant_newton0                                                                                                              0.1s
[+] Building 0.9s (1/1) FINISHED                                                                                                                                            
 => CANCELED [internal] booting buildkit                                                                                                                               0.9s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                                                     0.8s
 => => creating container buildx_buildkit_gallant_newton0  
Error response from daemon: Conflict. The container name "/buildx_buildkit_gallant_newton0" is already in use by container "8b56bc95c1e26b736d0f297236adce9766f1363b1f94b35fcbc29ac96b4b61d3". You have to remove (or rename) that container to be able to reuse that name.

Почему это происходит и как я могу предотвратить этот конфликт?

Этот контейнер, по-видимому, создается Docker BuildKit (новой заменой docker build), с использованием этого образа:
https://hub.docker.com/r/moby/buildkit

Чтобы отключить этот контейнер, вы можете установить экземпляр сборщика по умолчанию с помощью:

docker buildx use default

Ответ или решение

Когда вы используете Docker с помощью docker-compose и запускаете процесс сборки с помощью скрипта, в вашем случае создаётся контейнер moby/buildkit:buildx-stable-1, относящийся к BuildKit, который является новым механизмом сборки в Docker. Эта ситуация может привести к конфликтам имен контейнеров, когда вы пытаетесь создать новый экземпляр контейнера с именем, которое уже используется.

Причины конфликта контейнеров

  1. Сущность BuildKit: BuildKit использует контейнеры для выполнения сборки образов. Когда вы запускаете docker-compose build, BuildKit автоматически создаёт контейнер для выполнения необходимых действий, что в вашем случае и приводит к созданию контейнера с именем buildx_buildkit_gallant_newton0.

  2. Существующий контейнер: Ошибка, которую вы видите, говорит о том, что контейнер с тем же именем уже существует на вашей системе. Вероятно, он был создан при предыдущем вызове команды сборки, и не был удален автоматически, что может происходить в случае некорректного завершения или прерывания процесса сборки.

  3. Изоляция контейнеров: Docker использует имена контейнеров для идентификации экземпляров, и если вы пытаетесь создать новый контейнер с именем, которое уже используется, система выдаёт ошибку.

Решения проблемы

  1. Удаление существующего контейнера: Если работа с предыдущим контейнером не требуется, вы можете вручную удалить его командой:

    docker rm -f buildx_buildkit_gallant_newton0

    Это освободит имя для нового контейнера, и вы сможете успешно выполнить сборку.

  2. Настройка метода сборки: Чтобы избежать этой проблемы в будущем, вы можете установить стандартный экземпляр сборщика:

    docker buildx use default

    Этот шаг переопределит поведение BuildKit, и его настройка не будет создавать новые контейнеры с подобными именами.

  3. Использование временных контейнеров: Поскольку BuildKit может создавать временные контейнеры, вам стоит обратиться к конфигурациям BuildKit, где можно настроить использование временных контейнеров, которые удаляются автоматически по окончании работы.

  4. Проверка состояния контейнеров: Вы можете проверить список существующих контейнеров на вашем компьютере с помощью команды:

    docker ps -a

    Это поможет вам понять, какие контейнеры активны, и удалить те, которые вам больше не нужны.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...