Docker-compose выдает ошибки ‘ContainerConfig’ после обновления сегодня

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

Запущен сервер Ubuntu 22.04.4 LTS.

Сегодня я выполнил apt update и apt upgrade, которые загрузили несколько обновлений, а затем я скачал новые образы docker через docker-compose pull. После этого, когда я попытался перезапустить контейнеры через docker-compose, я получил кучу ошибок, связанных с конфигурацией контейнеров, и многие контейнеры отказались запускаться. Когда я выполнил docker ps -a, я заметил, что многие имена контейнеров изменились, добавив случайную строку символов перед предыдущим именем (например, swag теперь 5f6bfe94c235_swag). Я ничего не менял в файле docker-compose.yml, и до этого все работало нормально.

Когда я запускаю sudo docker-compose up -d, я получаю следующий вывод:

Traceback (most recent call last):
      File "/usr/bin/docker-compose", line 33, in <module>
        sys.exit(load_entry_point('docker-compose==1.29.2', 'console_scripts', 'docker-compose')())
      File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 81, in main
        command_func()
      File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 203, in perform_command
        handler(command, command_options)
      File "/usr/lib/python3/dist-packages/compose/metrics/decorator.py", line 18, in wrapper
        result = fn(*args, **kwargs)
      File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1186, in up
        to_attach = up(False)
      File "/usr/lib/python3/dist-packages/compose/cli/main.py", line 1166, in up
        return self.project.up(
      File "/usr/lib/python3/dist-packages/compose/project.py", line 697, in up
        results, errors = parallel.parallel_execute(
      File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute
        raise error_to_reraise
      File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer
        result = func(obj)
      File "/usr/lib/python3/dist-packages/compose/project.py", line 679, in do
        return service.execute_convergence_plan(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 579, in execute_convergence_plan
        return self._execute_convergence_recreate(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 499, in _execute_convergence_recreate
        containers, errors = parallel_execute(
      File "/usr/lib/python3/dist-packages/compose/parallel.py", line 108, in parallel_execute
        raise error_to_reraise
      File "/usr/lib/python3/dist-packages/compose/parallel.py", line 206, in producer
        result = func(obj)
      File "/usr/lib/python3/dist-packages/compose/service.py", line 494, in recreate
        return self.recreate_container(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 612, in recreate_container
        new_container = self.create_container(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 330, in create_container
        container_options = self._get_container_create_options(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 921, in _get_container_create_options
        container_options, override_options = self._build_container_volume_options(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 960, in _build_container_volume_options
        binds, affinity = merge_volume_bindings(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 1548, in merge_volume_bindings
        old_volumes, old_mounts = get_container_data_volumes(
      File "/usr/lib/python3/dist-packages/compose/service.py", line 1579, in get_container_data_volumes
        container.image_config['ContainerConfig'].get('Volumes') or {}
    KeyError: 'ContainerConfig'

Я могу вручную запустить контейнеры, используя команду:

sudo docker start <container_name>

Перезапуск сервиса docker и перезагрузка компьютера не помогли. Есть идеи, что сломалось с этим обновлением и как я могу это исправить?

У меня такая же ситуация. После перехода с docker-compose на docker compose все работает без других изменений.

Теперь мои контейнеры работают с:

docker compose up -d

вместо:

docker-compose up -d

Это потому, что docker-compose — это синтаксис V1, который теперь устарел. Синтаксис V2 — это docker compose, поскольку это теперь плагин, а не отдельная команда.

Сегодня я столкнулся с такой же проблемой.

docker-compose down

Это сработало для меня

..и если, как и я, вы вызывали docker-compose через ansible, то вам нужно обновить

community.docker.docker_compose:

на

community.docker.docker_compose_v2:

и, возможно, внести некоторые другие изменения, например, мне пришлось изменить “pull: true” на “pull: always”

Возможно, вам нужно сначала удалить остановленный контейнер.

$ docker ps -a | grep -i Exited

и попробовать снова с $ docker-compose up -d

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

$ docker-compose down
$ docker-compose up -d

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

    - name: stopping existing container
      shell:
        chdir: "ваш путь"
        cmd: "docker-compose down"

    - name: waiting 30 secondes to let the container stop
      ansible.builtin.pause:
        seconds: 30

    - name: deploy Docker Compose stack
      shell:
        chdir: "ваш путь"
        cmd: "docker-compose build && docker-compose up -d"

sudo docker-compose rm -f
sudo docker-compose up

Я использовал эти команды, чтобы исправить эту ошибку, но сначала лучше проверить, установлены ли все сертификаты и сам docker.

Я тоже столкнулся с этим, и я не могу сейчас использовать новый V2 docker compose. И все другие хосты в нашей сети работали нормально, с одинаковым docker-compose.yml и одинаковыми версиями docker и docker-compose.

Что сработало для меня прямо сейчас:

docker system prune --all --volumes
docker-compose up --detach

EDIT: Оказалось, другой инженер запустил docker compose up (V2) на этом хосте, так что поэтому у меня возникла эта проблема.

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

Проблема, с которой вы столкнулись после обновления и попытки перезапуска контейнеров с помощью Docker Compose на Ubuntu 22.04.4 LTS, в значительной степени связана с изменениями, произошедшими между версиями Docker Compose V1 и V2. Давайте более подробно рассмотрим, что могло пойти не так, и как вы можете это исправить.

Причины проблемы

  1. Обновление системы: При выполнении команд apt update и apt upgrade возможно, произошли изменения в системных библиотеках или сторонних пакетах, которые могли повлиять на совместимость с вашим текущим набором инструментария Docker и Docker Compose.

  2. Проблемы с конфигурацией контейнеров: Ошибка, которую вы получили, указывает на несоответствие в конфигурации контейнеров. Сообщение KeyError: 'ContainerConfig' подразумевает, что Docker Compose пытается получить информацию о конфигурации контейнера, но не может её найти. Это может быть вызвано тем, что часть данных о контейнерах не была правильно обновлена после перезагрузки образов.

  3. Изменение имени контейнера: Замена имен контейнеров на что-то вроде 5f6bfe94c235_swag может указывать на конфликт идентификаторов или использование не совместимых версий платформы Docker с Docker Compose.

Решения

  1. Переключение на V2: Одно из наиболее простых решений – использовать новый синтаксис Docker Compose версии 2. Вы можете заменить вызов docker-compose up -d на docker compose up -d. Docker Compose V2 теперь интегрирован как плагин к Docker, и это может помочь избежать конфликтов.

  2. Остановка и удаление контейнеров: Попробуйте выполнить следующие команды, чтобы остановить и удалить все остановленные контейнеры:

    docker-compose down
    docker-compose rm -f
    docker-compose up -d

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

  3. Очистка системы Docker: Иногда проблемы могут возникать из-за конфликтующих данных. Вы можете попробовать очистить ненужные образы, контейнеры, и тома с помощью:

    docker system prune --all --volumes

    После этого заново запустите контейнеры с помощью docker-compose up --detach.

  4. Совмещение с Ansible: Если вы используете Ansible для управления контейнерами, убедитесь, что вы обновили вызовы до нового подхода с community.docker.docker_compose_v2, чтобы исключить проблемы с совместимостью. Настройте свои плейбуки соответствующим образом.

  5. Проверка на остановленные контейнеры: Убедитесь, что на вашей системе не работают устаревшие контейнеры, которые могут препятствовать запуску новых. Проверьте это с помощью:

    docker ps -a | grep -i Exited

    Удалите их перед повторной попыткой запуска.

Заключение

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

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

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