SSH 接続時に、認証された SSH ユーザーを既に実行中の Docker コンテナにプロキシする方法はありますか?

SSH 接続時に、認証された SSH ユーザーを既に実行中の Docker コンテナにプロキシする方法はありますか?

私は、Linux ホスト (ssh アクセスあり) 上で常に Docker 化された Jupyter Notebook を実行しています。

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)"

現在は、まずホストに ssh で接続し、次にdocker exec -it <container-name> bashDocker コンテナ内で bash シェルを起動するなどの操作を行う必要があります。

ProxyCommand が間接的に 2 番目のホストに接続するのとほぼ同じ方法で、最初の ssh コマンドをコンテナーにプロキシする方法があるかどうか疑問に思っていました。

答え1

私のニーズに合っていると思われる解決策を見つけました。

これを~/.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

次に、クライアントで次のように ssh 構成を設定します。

Host vm1
    User my_user
    HostName my_host
Host vm1-sandbox
    User my_user
    HostName my_host
    RemoteCommand export SANDBOX=1; bash
    RequestTTY force

また、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

関連情報