64 lines
2.8 KiB
Bash
64 lines
2.8 KiB
Bash
#!/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}}'
|