在研究与容器共享 PID 命名空间时,我注意到一些我不明白的有趣的事情。当容器与主机共享 PID 命名空间时,某些进程的环境变量会受到保护,而其他进程则不会。
我们以mysql为例。我将启动一个带有环境变量集的容器:
ubuntu@sandbox:~$ docker container run -it -d --env MYSQL_ROOT_PASSWORD=SuperSecret mysql
551b309513926caa9d5eab5748dbee2f562311241f72c4ed5d193c81148729a6
Run Code Online (Sandbox Code Playgroud)
我将启动另一个共享主机 PID 命名空间的容器并尝试访问该environ文件:
ubuntu@sandbox:~$ docker container run -it --rm --pid host ubuntu /bin/bash
root@1c670d9d7138:/# ps aux | grep mysql
999        18212  5.0  9.6 2006556 386428 pts/0  Ssl+ 17:55   0:00 mysqld
root       18573  0.0  0.0   2884  1288 pts/0    R+   17:55   0:00 grep --color=auto mysql
root@1c670d9d7138:/# cat /proc/18212/environ
cat: /proc/18212/environ: Permission denied
Run Code Online (Sandbox Code Playgroud)
有些东西阻止了我读取环境变量的访问。我发现我需要CAP_SYS_PTRACE在容器中读取它:
ubuntu@sandbox:~$ docker container run -it --rm --pid host --cap-add …Run Code Online (Sandbox Code Playgroud)