Docker: unable to configure the Docker daemon — конфликт -H и hosts
Адрес демона Docker можно задать либо ключом -H в unit-файле, либо параметром hosts в daemon.json — но не двумя способами одновременно. При конфликте демон завершается с сообщением о том, что адрес указан дважды.
Что это значит
Причина частая: в дистрибутивном unit-файле уже стоит -H fd://, а администратор добавляет hosts в daemon.json, следуя руководству. Правильный порядок — убрать ключ из unit-файла через переопределение и оставить настройку в одном месте.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Адрес задан и в unit-файле, и в daemon.json
Демон не может выбрать, какой источник главнее, и отказывается работать. Это защита от неоднозначности.
-
Сокет-активация вместе с явным адресом
Значение
fd://означает получение дескриптора от docker.socket. Явный адрес в daemon.json с этим конфликтует.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Ключи запуска демона из действующего unit-файла.
systemctl cat docker | grep ExecStartНастройка адреса в файле демона.
sudo grep -i hosts /etc/docker/daemon.jsonСообщение о конфликте.
journalctl -u docker -n 20 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Демон не может выбрать, какой источник главнее, и отказывается работать. Это защита от неоднозначности.
- Как проверить
-
Посмотрите оба источника.
systemctl cat docker | grep -E "^ExecStart" sudo grep -i hosts /etc/docker/daemon.json
- Как исправить
-
Оставьте настройку в одном месте. Чтобы убрать ключ из unit-файла, сбросьте команду запуска в переопределении и задайте её заново без него.
sudo systemctl edit docker # [Service]\nExecStart=\nExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
- Почему происходит
- Значение
fd://означает получение дескриптора от docker.socket. Явный адрес в daemon.json с этим конфликтует.
- Как проверить
-
Посмотрите состояние сокета и настройку.
systemctl status docker.socket --no-pager | head -6 sudo grep -i hosts /etc/docker/daemon.json
- Как исправить
-
Выберите один способ: сокет-активацию (оставить
fd://) или явный адрес (убрать сокет из автозапуска).
Пример вывода
Адрес задан двумя способами. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
dockerd[4300]: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [unix:///var/run/docker.sock])
systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Сокет и служба включены одновременно: конфликт при загрузке При сокет-активации в автозапуск включена и служба, и сокет. Порт занимает то, что стартовало первым.
- status=1/FAILURE в systemd Код 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Docker и kubelet: несовпадение драйвера cgroup Драйвер контрольных групп Docker не совпадает с systemd: предупреждения, нестабильная работа контейнеров, проблемы с kubelet.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
Где встречается чаще всего
Источники
- Документация Docker: настройка демона через systemd
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено добавлением hosts в daemon.json при -H fd:// в unit-файле.