.dockerenv 和 .dockerinit 是什么?

.dockerenv 和 .dockerinit 是什么?

.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

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

我问这个问题是因为我正在研究我的 docker 执行工具 scuba 中有一个 bug。您可以传递--userdocker run设置容器中进程的 UID,但它在 /etc/passwd 中没有条目,因此我正在研究在容器启动期间创建用户的选项。

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

答案1

据我所知,没有关于他们的官方文献。

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

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

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

新的库容器/运行司机 (默认启用的驱动程序) 不使用这些文件。你会发现容器中的这些文件是空的。事实上,LXC 支持最近已从 docker 开发分支中删除

因此,尽管这些文件目前被应用程序广泛用于检测docker的存在,但也许这些文件将来最终会消失。

答案2

为了查明他们的代码是否在 docker 环境中运行,通常测试或/.dockerinit文件是否存在/.dockerenv

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

我们的代码中此类检查的一个示例实现:

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

相关内容