#!/usr/bin/env bash # Установка Docker Engine внутрь WSL Ubuntu, без Docker Desktop. # # Зачем: Docker Desktop 4.69 не стартует, если имя пользователя Windows содержит # кириллицу — его Inference manager не может создать unix-сокет по пути # C:\Users\<кириллица>\AppData\Local\Docker\run\dockerInference. Docker Engine # внутри WSL обходит проблему целиком и для нашей задачи даже уместнее: # нужен Linux с ROS 2, а WSL и есть Linux. # # Запуск (от root внутри WSL): # wsl -d Ubuntu -u root -- bash /mnt/c/Games/Study/AI_Lidar/docker/setup_wsl_docker.sh # # Откат: # apt-get remove --purge -y docker.io containerd && apt-get autoremove -y set -euo pipefail # Docker Desktop оставляет в PATH заглушку `docker`, которая только печатает # совет включить WSL-интеграцию. Поэтому всё делается по абсолютным путям. DOCKER=/usr/bin/docker DOCKERD=/usr/bin/dockerd echo "== состояние ==" . /etc/os-release && echo "дистрибутив: ${PRETTY_NAME}" echo "ядер: $(nproc), свободно на /: $(df -h / | awk 'NR==2 {print $4}')" if [ -x "$DOCKERD" ]; then echo "docker уже установлен: $($DOCKER --version)" else echo "== установка docker.io ==" export DEBIAN_FRONTEND=noninteractive apt-get update -qq apt-get install -y -qq --no-install-recommends docker.io iptables fi # В WSL нет systemd, демон поднимается напрямую. iptables переводится в # legacy-режим: nft-бэкенд в WSL обычно не работает, и docker падает на # настройке сети. update-alternatives --set iptables /usr/sbin/iptables-legacy >/dev/null 2>&1 || true update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy >/dev/null 2>&1 || true if $DOCKER info >/dev/null 2>&1; then echo "демон уже работает" else echo "== запуск демона ==" mkdir -p /var/log nohup "$DOCKERD" >/var/log/dockerd.log 2>&1 & for i in $(seq 1 40); do if $DOCKER info >/dev/null 2>&1; then echo "демон поднялся за ${i} с" break fi sleep 1 done fi if ! $DOCKER info >/dev/null 2>&1; then echo "ОШИБКА: демон не поднялся, последние строки журнала:" >&2 tail -40 /var/log/dockerd.log >&2 || true exit 1 fi echo "== готово ==" $DOCKER version --format 'клиент {{.Client.Version}}, сервер {{.Server.Version}} ({{.Server.Os}}/{{.Server.Arch}})' $DOCKER info --format 'ядер {{.NCPU}}, память {{.MemTotal}}, хранилище {{.Driver}}'