web-dev-qa-db-ja.com

docker "スポーンする代替のtelinit実装が見つかりませんでした"

私はMACユーザーで、VM "ubuntu 14.04"内にDockerをインストールしました。(すべて手動でインストールしました[〜#〜] not [〜#〜] docker toolboxを使用)

問題は、特定のコンテナーを起動すると(他のコンテナーは正常に実行される)、この奇妙なエラーメッセージ "spawnに代替の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>

前もって感謝します、

9
Mohamed Kamal

バージョンによっては、ここでいくつかのことが起こります。ダンウォルシュの以前の投稿を試しましたか? http://developers.redhat.com/blog/2014/05/05/running-systemd-within-docker-container/

古いバージョンでは、Dockerがsystemdを実行するために必要な2つの要件が原因である可能性があります。

  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"のどこかが共通のシンボリックリンクになり、イライラすることに注意してください。さらに混乱を招くのは、これがRed Hatベースのディストリビューション(CentOS)であり、そのレガシーフォールバックがSystemVではなくUpstartであることです。いずれにせよ、それを何と呼んでもかまいません。systemdバイナリへのシンボリックリンクであることを期待する/ usr/sbin/initではなく、systemdバイナリを直接使用してください。

最近のバージョンでは、シンボリックリンクを使用して物事を正しく試すことを試みましたが、実際に実行するコマンドを少しだけ変更するのが最善の方法です。

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

8
BoeroBoy