Вопрос или проблема
Я использую Debian на WSL. Nix уже установлен.
Я устанавливаю Docker с помощью этой команды:
nix-env -iA nixpkgs.docker
Я хочу запустить демон:
systemctl start docker
Не удалось подключиться к шине: Нет такого файла или директории
Обновление
Для вашего сведения:
$XDG_RUNTIME_DIR= /mnt/wslg/runtime-dir
$UID=1000
$DBUS_SESSION_BUS_ADDRESS не имеет значения
ls -l /mnt/wslg/runtime-dir
drwx—— 4 pierre pierre 120 26 дек 00:41 runtime-dir
Я могу получить доступ к шине. Но мне нужно использовать sudo
sudo systemctl start docker
Теперь у меня эта проблема
Не удалось запустить docker.service: юнит docker.service не найден.
Я думаю, что docker.service — это этот файл:
/etc/systemd/system/docker.service
Но его нет в моей ОС.
Я пытался удалить и переустановить Docker с помощью nix. Безуспешно.
Я думаю, это связано:
https://discourse.nixos.org/t/docker-packages-systemd-unit-files-dont-work-on-ubuntu/12160
sudo cp ~/.nix-profile/etc/systemd/system/docker.service /etc/systemd/system/docker.service
sudo cp ~/.nix-profile/etc/systemd/system/docker.sock /var/run/docker.sock
sudo systemctl enable docker
Не удалось запустить docker.service: юнит docker.socket не найден.
Не удалось запустить docker.service: юнит docker.socket не найден.
После прочтения этой ссылки, я использую эту команду, чтобы узнать, куда мне нужно заменить файл docker.socket:
systemctl list-sockets --all
Но docker.socket не указан
**обновление
Я выполнил все команды с нуля. Теперь у меня эта проблема:
Задание на зависимость для docker.service не выполнено. См. ‘journalctl -xe’ для подробностей.
Если я правильно понял проблему, вам нужно установить XDG_RUNTIME_DIR
вручную (потому что /run/user/...
иногда принадлежит какому-то другому пользователю?? (Не уверенно, если честно)):
Попробуйте установить XDG_RUNTIME_DIR = "/run/user/$UID"
, а затем снова запустить nix?
Если это не сработает, возможно, вам нужно установить DBUS_SESSION_BUS_ADDRESS
также на DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
.
Вы можете найти аналогичную тему здесь:
https://superuser.com/questions/1561076/systemctl-user-failed-to-connect-to-bus-no-such-file-or-directory-debian-9
Вам нужно найти директорию, используйте cd ..
и перейдите в /bin/
, там ваша программа, затем начинайте с ./docker
или используйте systemctl start docker.
sudo groupadd docker
sudo chgrp docker docker.sock
sudo systemctl start docker
Нет сообщения об ошибке
Вам нужно изменить настройки по умолчанию docker.service
, например, изменив параметры запуска
[Unit]
...
Requires=~/.nix-profile/etc/systemd/system/docker.socket
[Service]
...
ExecStart=/home/xx/.nix-profile/bin/dockerd -H unix:///var/run/docker.sock
Возможно, вам нужно перезагрузить
sudo systemctl daemon-reload
Ответ или решение
Установка и запуск Docker с использованием Nix на Debian (в WSL) могут вызвать некоторые сложности из-за особенностей управления сервисами и прав доступа. Ниже приведены шаги для успешной установки и запуска Docker в вашей конфигурации:
Шаг 1: Установка Docker с использованием Nix
Как вы уже сделали, сначала установите Docker с помощью команды:
nix-env -iA nixpkgs.docker
Шаг 2: Создание группы Docker
Убедитесь, что у вас есть группа docker
, и вы являетесь её членом, чтобы избежать необходимости использовать sudo
для выполнения Docker команд. Выполните следующие команды:
sudo groupadd docker # Создание группы docker, если она еще не существует
sudo usermod -aG docker $USER # Добавляем текущего пользователя в группу docker
После этого выйдите и войдите обратно в систему, чтобы изменения вступили в силу.
Шаг 3: Настройка XDG_RUNTIME_DIR
Настройка переменной окружения XDG_RUNTIME_DIR
критично важна для работы Docker в WSL:
export XDG_RUNTIME_DIR="/run/user/$UID"
Добавьте эту строку в ваш файл ~/.bashrc
или ~/.zshrc
, чтобы она применялась автоматически при запуске терминала.
Шаг 4: Настройка DBUS_SESSION_BUS_ADDRESS
Если вы столкнулись с проблемами подключения к bus, попробуйте также установить переменную DBUS_SESSION_BUS_ADDRESS
:
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
Вставьте это в тот же файл, что и предыдущую строку.
Шаг 5: Запуск Docker Daemon
Поскольку WSL не поддерживает systemd, вам нужно запускать Docker напрямую. Воспользуйтесь следующей командой для запуска Docker Daemon:
dockerd &
Это запустит Docker в фоновом режиме. Убедитесь, что вы находитесь в той же сессии терминала, так как он будет использовать окружения, которые были установлены выше.
Шаг 6: Тестирование установки
Для проверки работы Docker выполните следующую команду:
docker run hello-world
Если всё корректно настроено, то изображение будет загружено, и вы увидите сообщение о том, что Docker работает.
Дополнительные советы
Если вам нужно изменить конфигурацию docker.service
, вы также можете это сделать. Пример конфигурации:
[Unit]
Description=Docker Application Container Engine
Requires=~/.nix-profile/etc/systemd/system/docker.socket
[Service]
ExecStart=/home/your_username/.nix-profile/bin/dockerd -H unix:///var/run/docker.sock
Шаг 7: Перезапуск демона
Если вы вносили изменения в систему, возможно, потребуется выполнить команду для перезагрузки конфигурации сервисов (что может быть не применимо в WSL):
sudo systemctl daemon-reload
Однако, в большинстве случаев на WSL это не будет работать, так как systemd не установлен. Вместо этого просто убедитесь, что dockerd
работает.
Заключение
Выполнив вышеописанные шаги, вы должны успешно установить и запустить Docker на Debian через WSL с использованием Nix. Убедитесь, что вы следите за выводом команд и справляетесь с возможными ошибками. Если возникнут дополнительные проблемы, обратитесь к документации Docker или обращениям о поддержке Nix.