.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
其他人也问过类似的问题,但我找不到答案:
- .dockerinit / .dockerenv(2015 年 9 月 12 日)
我问这个问题是因为我正在研究我的 docker 执行工具 scuba 中有一个 bug。您可以传递--user
给docker 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 文件是否存在。
- 引用另一个来源:
我不确定
/.dockerenv
这有多正式——几乎没有记录,但是docker/libnetwork#815似乎意味着它将持续更长时间
我们的代码中此类检查的一个示例实现:
if ! [ -f /.dockerenv ] ; then
echo "Not running inside docker, exiting to avoid data damage." >&2
exit 1
fi