gpt4 book ai didi

docker "Couldn' t 找到一个替代的 telinit 实现来生成”

转载 作者:IT老高 更新时间:2023-10-28 21:22:49 30 4
gpt4 key购买 nike

我是 MAC 用户,并在虚拟机“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>

提前致谢,

最佳答案

根据您的版本,这里可能会发生一些事情。你试过丹沃尔什的旧帖子吗? http://developers.redhat.com/blog/2014/05/05/running-systemd-within-docker-container/

在旧版本中,这可能是因为 Docker 需要执行 systemd 的两个要求:

  1. 需要使用 --privileged 运行
  2. 需要包含卷/sys/fs/cgroup

如果你strace,你可能会发现:

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”这一行的某个地方变成了常见的符号链接(symbolic link),这令人沮丧。更令人困惑的是,这是一个基于 Red Hat 的发行版 (CentOS),其遗留的后备应该是 Upstart,而不是 SystemV。在任何情况下,直接调用它是有帮助的:直接使用 systemd 二进制文件,而不是/usr/sbin/init 希望它是 systemd 二进制文件的符号链接(symbolic link)。

在现代版本中,我尝试使用符号链接(symbolic link)来解决问题,但发现最好的方法实际上只是稍微更改运行命令。

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 规范。强尼B

关于docker "Couldn' t 找到一个替代的 telinit 实现来生成”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36545105/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com