
Eu tenho um Jupyter Notebook Dockerizado sempre rodando em um host Linux (onde tenho acesso ssh).
docker run -d \
--hostname="$(logname)-sandbox" \
-e NB_UID="$(id -u $(logname))" \
-e NB_GID="$(id -g $(logname))" \
-e GRANT_SUDO=1 \
-e NB_USER="$(id -un $(logname))" \
-e NB_GROUP="$(id -gn $(logname))" \
--user=root \
--restart=always \
--name="$(logname)-sandbox" \
-v "${HOME}":"/home/$(logname)" \
-p 8010:8888 \
jupyter/base-notebook:latest \
start-notebook.sh --notebook-dir="/home/$(logname)"
Atualmente preciso primeiro fazer ssh no host e, em seguida, faço algo como docker exec -it <container-name> bash
iniciar um shell bash dentro do contêiner Docker.
Eu queria saber se havia uma maneira de fazer proxy do comando ssh inicial no contêiner, da mesma maneira que o ProxyCommand faz para se conectar indiretamente a um segundo host.
Responder1
Encontrei uma solução que parece estar funcionando para minhas necessidades.
Adicione isto ao topo de ~/.bashrc
# Enter Container if SANDBOX=1, else continue as normal
if [[ "${SANDBOX}" -eq "1" ]]; then
# Only allocate tty if one is detected, see: https://stackoverflow.com/questions/911168
if [[ -t 0 ]]; then DOCKER_RUN_OPTIONS+=(-i); fi
if [[ -t 1 ]]; then DOCKER_RUN_OPTIONS+=(-t); fi
exec docker exec "${DOCKER_RUN_OPTIONS[@]}" "$(logname)-sandbox" bash "$@"
fi
Agora configure uma configuração ssh no cliente assim:
Host vm1
User my_user
HostName my_host
Host vm1-sandbox
User my_user
HostName my_host
RemoteCommand export SANDBOX=1; bash
RequestTTY force
Também testei se funciona conforme o esperado em combinação com JumpHost:
Host vm2_jump
User jump_user
HostName jump_host
Host vm2
User my_user
HostName my_host
ProxyJump vm2_jump
Host vm2-sandbox
User my_user
HostName my_host
ProxyJump vm2_jump
RemoteCommand export SANDBOX=1; bash
RequestTTY force