我的容器文件系统根目录中的.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 的存在。
小智 8
为了找出他们的代码是否在 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16547 次 |
| 最近记录: |