Docker “码头工人”;不能';“找不到替代telinit实现来生成”;

Docker “码头工人”;不能';“找不到替代telinit实现来生成”;,docker,ubuntu-14.04,docker-compose,hhvm,Docker,Ubuntu 14.04,Docker Compose,Hhvm,我是MAC用户,在VM“ubuntu 14.04”中安装了docker。(我手动安装了所有组件,而不是使用docker工具箱安装) 问题是,当我启动特定的容器(其他容器正常运行)时,它会给我一条奇怪的错误消息“找不到替代的telinit实现来生成” 以下是我用来构建映像的Dockerfile: FROM diegomarangoni/hhvm:cli # install php composer. # It needs git and the PHP zip extension # zlib1

我是MAC用户,在VM“ubuntu 14.04”中安装了docker。(我手动安装了所有组件,而不是使用docker工具箱安装)

问题是,当我启动特定的容器(其他容器正常运行)时,它会给我一条奇怪的错误消息“找不到替代的telinit实现来生成”

以下是我用来构建映像的Dockerfile:

FROM diegomarangoni/hhvm:cli

# install php composer.
# It needs git and the PHP zip extension
# zlib1g-dev is needed to compile the PHP zip extension
# openssh-client provides ssh-keyscan
RUN apt-get update \
    && apt-get install --assume-yes --no-install-recommends curl git zlib1g-dev openssh-client \
    && apt-get clean && rm -r /var/lib/apt/lists/* \
    && curl -sS https://getcomposer.org/installer -o installer \
    && hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 installer \
    && mv composer.phar /usr/local/bin/composer \
    && rm installer

WORKDIR /home/assert/scripts

COPY scripts/composer.json /home/assert/
COPY scripts /home/assert/scripts

RUN hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 -v Eval.Jit=false \
    /usr/local/bin/composer install

# Run the assert container web server
CMD ["hhvm", "-v", "Eval.Jit=false", "/home/assert/scripts/vendor/bin/phpunit", "/home/assert/scripts/tests", "--configuration", "/home/assert/scripts/tests/phpunit.xml"]

# keep it running
CMD /sbin/init
我用命令启动它:

docker run <CONTAINER>
docker运行

提前感谢,

根据您的版本,这里可能会发生一些事情。你试过丹·沃尔什以前的帖子吗

在旧版本中,这可能是因为Docker需要满足两个要求:

  • 需要运行--特权
  • 需要包括卷/sys/fs/cgroup
  • 如果您走近,您可能会发现:

    ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
    lstat("/run/systemd/system/", 0x7fffa5b4e300) = -1 ENOENT (No such file or directory)
    execve("/lib/sysvinit/telinit", ["/usr/sbin/init"], [/* 8 vars */]) = -1 ENOENT (No such file or directory)
    writev(2, [{"Couldn't find an alternative tel"..., 61}, {"\n", 1}], 2Couldn't find an alternative telinit implementation to spawn.
    ) = 62
    exit_group(1)                           = ?
    +++ exited with 1 +++
    
    注意,沿着“init”和“telinit”这条线的某个地方变成了常见的符号链接,这令人沮丧。更令人困惑的是,这是一个基于Red Hat的发行版(CentOS),其遗留的回退应该是Upstart,而不是SystemV。在任何情况下,直接使用systemd binary都是有帮助的:不要使用/usr/sbin/init,希望它是systemd binary的符号链接

    在现代版本中,我曾尝试使用符号链接来纠正错误,但找到最好的方法实际上只是稍微更改一下run命令

    docker run -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro [image] /bin/bash
    
    一旦到了这一步,就可以直接运行systemd:

    /usr/lib/systemd/systemd --system --unit=basic.target
    
    以下是我对systemd版本的看法:

    Name        : systemd
    Arch        : x86_64
    Version     : 219
    Release     : 19.el7_2.12
    Size        : 5.1 M
    
    希望这有帮助。很多旧文档和不断变化的systemd规范。
    JohnnyB

    我使用了blockpost中提到的Dockerfile(尽管还有另一个CentOS 7基本映像)并使用了run命令。但是,当运行
    docker run-ti-v/sys/fs/cgroup:/sys/fs/cgroup:ro[myimage]/bin/bash
    时,我发现
    找不到cgroup装入点:不允许的操作分配管理器对象失败:不允许的操作
    我在CentOS 7.8启用系统的映像上也面临这个问题。无法获取D总线连接:操作未完成permitted@Niraj,这有助于我解决这个问题: