问题
在使用docker-enter之前要想进入docker容器, 需要使用docker attach docker-name
来进入docker.
这样进入docker容器的话, 必须使用ctrl + P ctrl + Q
来退出容器, 如果直接exit
的话, 会导致docker容器停掉(效果类似docker stop docker-name
).
解决方案
由于docker使用了linux中命名空间技术, 因而可以使用nsenter来进行命名空间的切换, 而nsenter包含在util-linux包中, 需要在较新的版本中才支持, 经过测试2.25可用.
首先判断自己系统中有没有nsenter, 如果有则直接添加docker-enter脚本, 否则需要安装nsenter.
nsenter安装
要安装nsenter, 只执行以下命令即可
# 安装相关依赖
sudo apt-get install autopoint autoconf libtool automake make
# 下载util-linux源码包
cd /tmp
curl https://www.kernel.org/pub/linux/utils/util-linux/v2.25/util-linux-2.25.tar.gz
tar zxvf util-linux-2.25.tar.gz
cd util-linux-2.25
# 编译并安装
sudo ./configure --without-python --disable-all-programs --enable-nsenter --without-ncurses
sudo make nsenter
sudo cp nsenter /usr/local/bin
docker-enter脚本安装
docker-enter命令其实就是一个bash脚本, 放到/usr/local/bin目录下面, 内容如下:
#!/bin/sh
if [ -e $(dirname "$0")/nsenter ]; then
NSENTER=$(dirname "$0")/nsenter
else
NSENTER=nsenter
fi
if [ -z "$1" ]; then
echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
echo ""
echo "Enters the Docker CONTAINER and executes the specified COMMAND."
echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
PID=$(docker inspect --format "{{.State.Pid}}" "$1")
if [ -z "$PID" ]; then
exit 1
fi
shift
OPTS="--target $PID --mount --uts --ipc --net --pid --"
if [ -z "$1" ]; then
# No command given.
# Use su to clear all host environment variables except for TERM,
# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
# and start a login shell.
"$NSENTER" $OPTS su - root
else
# Use env to clear all host environment variables.
"$NSENTER" $OPTS env --ignore-environment -- "$@"
fi
fi
使用
要想进入docker容器, 直接docker-enter docker-name
即可;
退出的话, 则直接exit
, 这样操作不会造成docker容器的停止, 是安全的.