Lidar_Muxa/docker/setup_wsl_docker.sh

64 lines
2.8 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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}}'