Что означает ошибка permission denied в docker-compose
Ошибка permission denied (доступ запрещён) при запуске docker-compose в Linux возникает, когда текущий пользователь не имеет прав на чтение/запись в Unix-сокет Docker (/var/run/docker.sock). Это основной интерфейс связи между клиентами (docker, docker-compose) и демоном Docker (dockerd).
Типичный текст ошибки:
ERROR: Can't connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
или
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
Ошибка блокирует выполнение любых команд docker-compose (up, down, ps, logs и т.д.), так как без доступа к демону Docker невозможно управлять контейнерами.
Причины возникновения
- Пользователь не состоит в группе
docker
По умолчанию доступ к/var/run/docker.sockограничен группойdocker. Если пользователь не в этой группе, система возвращаетEACCES(Permission denied). - Docker daemon не запущен
Если службаdockerостановлена (systemctl status dockerпоказываетinactive), сокет может отсутствовать или быть недоступным. - Некорректные права на сокет
/var/run/docker.sock
Владелец сокета должен бытьroot:docker, а права —srw-rw----(660). Если права изменены (например,777или644), доступ нарушается. - Запуск docker-compose от root через
sudoбез настройки окружения
При использованииsudoпеременные окружения (например,DOCKER_HOST) могут сбрасываться, что приводит к ошибке подключения. - Использование удалённого Docker daemon без правильного
DOCKER_HOST
Если Docker настроен на удалённый хост, но переменнаяDOCKER_HOSTне указана, docker-compose пытается подключиться к локальному сокету без прав.
Способ 1: Добавить пользователя в группу docker (рекомендуется)
Это правильное и безопасное решение. Оно даёт пользователю доступ к Docker без использования sudo.
- Добавьте текущего пользователя в группу
docker:sudo usermod -aG docker $USER
Флаг-aGдобавляет пользователя к группеdockerбез удаления из других групп. - Примените изменения группы:
- Вариант A: Выйдите из системы и войдите заново (или перезагрузите компьютер). Это гарантирует, что новая группа активируется во всех сессиях.
- Вариант B: В текущей сессии выполните
newgrp docker, чтобы группаdockerстала активной без перезалогинивания.
- Проверьте членство в группе:
groups
В выводе должна быть группаdocker. - Проверьте доступ к Docker:
docker ps
Если команда выполняется без ошибок, docker-compose тоже будет работать.
💡 Совет: После добавления в группу может потребоваться перезапуск терминала или сессии, чтобы изменения вступили в силу.
Способ 2: Запустить docker-compose через sudo (временное решение)
Используйте sudo для запуска docker-compose, если нужно срочно решить задачу, но это не рекомендуется для повседневного использования из-за рисков безопасности.
sudo docker-compose up
Недостатки:
- Контейнеры запускаются от root, что даёт им полный доступ к хостовой системе.
- Файлы, созданные в контейнере, будут принадлежать root, что может вызвать проблемы с правами при последующем доступе от обычного пользователя.
- Переменные окружения и конфигурационные файлы (
.env) могут игнорироваться.
⚠️ Важно: Используйте этот способ только для тестирования или в изолированных средах. Для продакшена настройте группу
docker.
Способ 3: Изменить права на сокет docker.sock (не рекомендуется)
Если по каким-то причинам нельзя добавить пользователя в группу docker, можно временно изменить права на сокет. Это снижает безопасность, так как любой пользователь получит доступ к Docker daemon.
- Проверьте текущие права:
ls -l /var/run/docker.sock
Пример вывода:srw-rw---- 1 root docker 0 Feb 17 12:00 /var/run/docker.sock - Измените права на 666 (доступ для всех):
sudo chmod 666 /var/run/docker.sock
После этого ошибкаpermission deniedисчезнет, но любой пользователь системы сможет управлять Docker. - Верните права обратно после использования:
sudo chmod 660 /var/run/docker.sock sudo chown root:docker /var/run/docker.sock
⚠️ Важно: Этот способ следует использовать только в контролируемых средах (например, в тестовом контейнере) и временно. На постоянной основе настраивайте группы.
Способ 4: Проверить и запустить Docker daemon
Еслиdocker daemon не запущен, даже добавление в группу docker не поможет.
- Проверьте статус службы Docker:
systemctl status docker - Если служба неактивна (
inactive), запустите её:sudo systemctl start docker - Включите автозапуск Docker при загрузке системы:
sudo systemctl enable docker - Перезапустите docker-compose после запуска демона.
Способ 5: Исправить конфигурацию docker-compose (если используется удалённый хост)
Если Docker настроен на удалённый хост, убедитесь, что переменная окружения DOCKER_HOST установлена правильно.
- Установите
DOCKER_HOST(пример для TCP-соединения):export DOCKER_HOST=tcp://remote-host:2375
Или для TLS:export DOCKER_HOST=tcp://remote-host:2376 - Проверьте подключение:
docker info - Запустите docker-compose:
docker-compose up
💡 Совет: Для постоянного использования добавьте
export DOCKER_HOST=...в~/.bashrcили~/.profile.
Профилактика
- Добавляйте пользователя в группу
dockerсразу после установки Docker
При установке Docker из официального репозитория (в Ubuntu/Debian) группаdockerсоздаётся автоматически. Добавьте пользователя командойsudo usermod -aG docker $USERдо первого запуска docker-compose. - Не используйте
sudoдля docker-compose в повседневной работе
Регулярное использованиеsudoприводит к накоплению файлов, принадлежащих root, что усложняет управление проектами. - Регулярно обновляйте Docker и docker-compose
Устаревшие версии могут иметь проблемы с правами. Проверяйте обновления:sudo apt update && sudo apt upgrade docker-ce docker-compose-plugin - Проверяйте права на
/var/run/docker.sockпосле перезагрузки
Иногда сброс прав происходит при обновлении системы. Убедитесь, что владелец —root:docker, а права —660. - Используйтеdocker compose (плагин) вместо отдельного бинарника
В современных версиях Docker (20.10+) docker-compose встроен как плагин (docker compose). Он использует тот же сокет и те же права, что иdocker, что снижает вероятность проблем:docker compose up
Частые вопросы (FAQ)
Почему после добавления в группу docker ошибка осталась?
После добавления в группу нужно выйти из системы и заново войти (или выполнить newgrp docker). Без этого сессия продолжает использовать старый список групп.
Как проверить, в какой группе я нахожусь?
Выполните groups или id -nG. Если docker нет в списке, пользователь не в группе.
Что делать, если группа docker не создана?
Группа docker создаётся при установке Docker Engine. Если её нет, переустановите Docker:
sudo apt remove docker-ce docker-ce-cli containerd.io
sudo apt install docker-ce docker-ce-cli containerd.io
Можно ли добавить пользователя в группу docker без sudo?
Нет, для изменения групп требуются права root. Используйте sudo или войдите как root.
Почему docker ps работает, а docker-compose up — нет?
Возможно, docker-compose устарел или установлен из стороннего репозитория с другими правами. Обновите docker-compose:
sudo apt upgrade docker-compose-plugin
Или используйте встроенный плагин: docker compose up.