什么是 .dockerenv 和 .dockerinit?

Jon*_*art 17 docker

我的容器文件系统根目录中的.dockerenv.dockerinit文件是什么?它们是如何使用的?有关于这些文件的文档吗?

root@18ceee4f9041:/# ls -al /
total 72
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 .
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 ..
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerenv
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerinit
Run Code Online (Sandbox Code Playgroud)

其他人也问过类似的问题,但我找不到答案:

我问是因为我正在处理我的 docker 执行工具中的一个错误,称为 scuba。您可以通过--usertodocker run设置容器中进程的 UID,但它在 /etc/passwd 中没有条目,因此我正在研究在容器启动期间创建用户的选项。

(交叉发布在 Stack Overflow 上,可能会被关闭。)

zua*_*azo 14

AFAIK 没有关于它们的官方文档。

那些仅由旧的和已弃用的 LXC 执行驱动程序使用的文件。它们是 docker 在使用 LXC 运行容器时需要的 hack。

.dockerinit是一种init 进程。它是由lxc-attach启动容器时调用的命令运行的二进制文件。它负责设置环境、用户和工作目录,然后运行您的入口点/cmd。

.dockerenv包含在容器内定义的环境变量。它们用于在 lxc-attach 之后正确设置环境变量。该文件已被.dockerinit进程读取

新的libcontainer / runc驱动程序(默认启用的驱动程序)不使用这些文件。您会发现它们在您的容器中是空的。事实上,LXC 支持最近已从 docker 开发分支中删除

所以也许这些文件在未来最终会消失,尽管目前应用程序广泛使用它们来检测 docker 的存在。

  • 一个小错误:根据源代码,它们是挂载点,在 Docker 的核心中指定,而不是特定于 LXC 驱动程序。 (3认同)
  • 到了 2020 年,`/.dockerenv` 仍然存在于每个 docker 容器中。 (2认同)

小智 8

为了找出他们的代码是否在 docker 环境中运行,测试文件/.dockerinit/.dockerenv文件是否存在是很流行的。

由于 dockerinit 文件在较新版本中删除,现在最好的方法是检查 dockerenv 文件是否存在。

来自我们代码的此类检查的示例实现:

if ! [ -f /.dockerenv ] ; then
  echo "Not running inside docker, exiting to avoid data damage." >&2
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)