実行中のコンテナと同じ名前空間でプロセスを実行する

Dockerで実行中のコンテナに入って調査するにはnsenterを使います。正確には、nsenterコマンドを使って、コンテナと同じ名前空間でプロセスを実行します。

nsenterコマンドにはコンテナのPIDや諸々の引数を渡す必要があるので、下記を .bashrc や .zshrc に書いておきます。

# Docker: enter into the container
function docker-enter () {
  local container="$1"
  if [ -z "$container" ]; then
    echo "Usage: $0 CONTAINER [COMMAND ARGS...]"
    echo
    docker ps
    return 1
  fi
  shift
  sudo nsenter -m -u -i -n -p -t "$(docker inspect --format {{.State.Pid}} "$container")" "$@"
}

使用例。

% docker-enter 
Usage: docker-enter CONTAINER [COMMAND ARGS...]

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES
a2b0567b3899        my:jenkins          java -jar jenkins.wa   14 hours ago        Up 14 hours         8009/tcp, 8080/tcp     jenkins,lb/jenkins   

% docker-enter jenkins /bin/bash
bash-4.2#

なお、nsenterはutil-linux-2.23以降で使えます。