docker - 如何在 docker run 中使用 --init 参数

标签 docker

docker run--init--init-path选项,但是不清楚怎么用。

起初,我认为它类似于 dumb-init ,但包含在 docker core 中(一种“本地”)。但是 --init 键要求也设置 --init-path ,指向 docker-init 二进制文件,并且没有给出任何线索在哪里拿。 Google 对 docker-init 保持沉默。

好的,也许我应该使用 yelp/dumb-init 或 'phusion/baseimage-docker',但这些解决方案似乎没有使用 docker run--init 选项。

所以,我很好奇我应该把这个“docker-init 二进制”放在哪里来设置 --init-path 到?

最佳答案

在运行命令中指定新的 docker --init 选项基本上会将 ENTRYPOINT 设置为 tini并将 CMD 传递给它或您在命令行中指定的任何内容。

例如,没有 init,CMD 变为 pid 1。在这种情况下,/bin/bash

docker run -ti --rm ubuntu:16.04 /bin/bash
root@d740f7360840:/# ps -fA
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 03:30 ?        00:00:00 /bin/bash
root        11     1  0 03:30 ?        00:00:00 ps -fA

使用--init,tini (/dev/init) 变为 pid 1

docker run -ti --init --rm ubuntu:16.04 /bin/bash
root@5b5fe6ee71b5:/# ps -fA
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 03:30 ?        00:00:00 /dev/init -- /bin/bash
root         7     1  0 03:30 ?        00:00:00 /bin/bash
root        12     7  0 03:30 ?        00:00:00 ps -fA

tini 是一个可以作为 pid 1 正确运行的一流的 init 进程。 pid 1 进程必须正确地获取 fork 的子进程,否则会发生诸如资源泄漏和僵尸出现等坏事。

对于那些 fork 并且没有考虑到 child 收获的应用程序,这就是您想要的,因为通常他们会将这留给 init 系统。一个经典的例子是 java Jenkins 应用程序。

关于docker - 如何在 docker run 中使用 --init 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43122080/

相关文章:

ubuntu - Docker 容器创建由 root 拥有的目录,我需要它们由 1000 :1000 拥有

docker - 为docker机器和docker容器获取了相同的Ubuntu镜像,但docker-machine中提供了更多二进制文件

docker - Docker 上的桥接网络与 VMWare/VirtualBox 上的桥接网络似乎非常不同。为什么?

docker - 来自带有 Gunicorn 的 Docker 容器的 ModuleNotFoundError

docker - Docker容器导出并将其导入镜像

django - Vagrant 托管的 docker 容器无法启动

amazon-web-services - Tensorflow docker 图像不使用 GPU 进行推理/预测

javascript - 从 MongoDB 检索 Docker 日志

linux - AWS ECS 上的 Docker 容器始终显示 STOPPED

windows - 我可以在容器内使用命名管道吗?