Вопрос или проблема
Запущен сервер 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. Давайте более подробно рассмотрим, что могло пойти не так, и как вы можете это исправить.
Причины проблемы
-
Обновление системы: При выполнении команд
apt update
иapt upgrade
возможно, произошли изменения в системных библиотеках или сторонних пакетах, которые могли повлиять на совместимость с вашим текущим набором инструментария Docker и Docker Compose. -
Проблемы с конфигурацией контейнеров: Ошибка, которую вы получили, указывает на несоответствие в конфигурации контейнеров. Сообщение
KeyError: 'ContainerConfig'
подразумевает, что Docker Compose пытается получить информацию о конфигурации контейнера, но не может её найти. Это может быть вызвано тем, что часть данных о контейнерах не была правильно обновлена после перезагрузки образов. -
Изменение имени контейнера: Замена имен контейнеров на что-то вроде
5f6bfe94c235_swag
может указывать на конфликт идентификаторов или использование не совместимых версий платформы Docker с Docker Compose.
Решения
-
Переключение на V2: Одно из наиболее простых решений – использовать новый синтаксис Docker Compose версии 2. Вы можете заменить вызов
docker-compose up -d
наdocker compose up -d
. Docker Compose V2 теперь интегрирован как плагин к Docker, и это может помочь избежать конфликтов. -
Остановка и удаление контейнеров: Попробуйте выполнить следующие команды, чтобы остановить и удалить все остановленные контейнеры:
docker-compose down docker-compose rm -f docker-compose up -d
Это поможет восстановить корректное состояние вашей среды.
-
Очистка системы Docker: Иногда проблемы могут возникать из-за конфликтующих данных. Вы можете попробовать очистить ненужные образы, контейнеры, и тома с помощью:
docker system prune --all --volumes
После этого заново запустите контейнеры с помощью
docker-compose up --detach
. -
Совмещение с Ansible: Если вы используете Ansible для управления контейнерами, убедитесь, что вы обновили вызовы до нового подхода с
community.docker.docker_compose_v2
, чтобы исключить проблемы с совместимостью. Настройте свои плейбуки соответствующим образом. -
Проверка на остановленные контейнеры: Убедитесь, что на вашей системе не работают устаревшие контейнеры, которые могут препятствовать запуску новых. Проверьте это с помощью:
docker ps -a | grep -i Exited
Удалите их перед повторной попыткой запуска.
Заключение
Предлагаемые решения могут помочь вам восстановить нормальную работу контейнеров после обновления. Переход на новый синтаксис V2 Docker Compose, очистка ненужных ресурсов и тщательная проверка конфигураций и зависимостей обычно решают большинство связанных с этим проблем. Если эти шаги не помогут, возможно, вам стоит рассмотреть возможность отката обновлений или дальнейшего изучения логов Docker для выявления более конкретных ошибок.