Dockerコンテナを起動しようとしています(おそらくhttps://github.com/ibuildthecloud/systemd-docker、私は "systemd --user"ユニットファイルから見つけました。最初から始めてください。
問題は、After=docker.service
systemdユーザーモードデバイスがsystemdシステムモードデバイスを表示できないため、これを実行できないことです。
誰でもこの問題を解決する良い方法はありますか?
これまでのところ、私の「最高の」アイデアは、「docker info」が意味のあるものを返し、After =を返すまでループで待機するスクリプトを実行するために一度だけ実行されるシステムユニットを作成することです。方法。
答え1
この問題を解決する良い方法は、Dockerデーモン(次から実行)を使用することです。システムsystemd)ソケットアクティベーションを有効にします。
これにより、dockerコマンドを起動したとき(例:ユーザーsystemdデバイス)接続するソケットがありますが、Dockerデーモンが実際にサービスを提供する準備ができるまでブロックされます。
明示的な依存関係を排除するためのソケットアクティベーションの基本的なアイデアは、で説明されています。systemdブログのこの投稿では、伝統的に明示的な依存関係を介して処理されているがソケットアクティベーションを使用すると、これ以上設定する必要がない4つのサービスについて説明しています。以下は抜粋です(長いですが意味があります)。
ソケットを有効にすると、注文なしでまったく同時に4つのサービスをすべて開始できます。リスニングソケットの作成がデーモンプロセスの外部に移動されたため、同時に起動でき、互いにソケットにすぐに接続できます。つまり、1 段階で
/dev/log
ソケットが作成され、/run/dbus/system_bus_socket
次の段階で 4 つのサービスがすべて同時に作成されます。 D-Busは、syslogにログを書き込もうとしたときに/dev/log
ソケットバッファがいっぱいになっていない限り、他の初期化操作をただちに実行できます。 syslogサービスがキャプチャされると、待機中のメッセージを処理します。ソケットバッファがいっぱいになると、クライアントロギングはソケットに書き換えられるまで一時的にブロックされ、ログメッセージを書き込むことができるときに続きます。これは、私たちのサービスのスケジューリングが完全にカーネルによって行われることを意味します。ユーザー空間の観点から見ると、すべてのサービスが同時に実行され、1つのサービスがそれを必要とする他のサービスに追いつくことができない場合、その要求は一時的にブロックされます。利用可能な場合は実行を続けます。これらの要求が送信されました。これらすべては完全に自動で、ユーザースペースには見えません。これにより、ソケットのアクティブ化によって開始を大幅に並列化できるため、以前はシリアライゼーションが厳密に必要であると考えられていたサービスを同時に開始できます。ほとんどのLinuxサービスはソケットを通信チャネルとして使用します。ソケットを有効にすると、クライアントとサーバーはこれらのチャネルを同時に起動できます。
Dockerデーモンはソケットのアクティブ化をサポートします。2014年からそのため、使用しているバージョンがすでにこの機能をサポートしている可能性があります。
ディストリビューションにdocker.socket
ユニットが含まれていることを確認してください。この場合、ユニットを有効にするだけです。
Dockerデーモンがソケットの有効化をサポートしているが、ディストリビューションにこのデバイスがdocker.socket
含まれていない場合は、確認してください。このチュートリアル設定方法の説明です。
考慮すべき別のオプションは、DockerからDockerに切り替えることです。ポッドキャスト。
PodmanはDockerのドロップイン互換の代替品になることを試みます(したがって、同じコマンドラインを使用できるためdocker
)podman
。
これらの主な違いは、podmanにデーモンが必要ないため、コンテナを起動する前にデーモンが起動するのを待つ必要がないことです。 Podmanは、最新バージョンのLinuxディストリビューションでソフトウェアパッケージとして提供されています。そして、今のように使用できるという事実は、docker
始めるのが簡単になるでしょう。
答え2
ところで、私はコンテナを実行するためにsystemdを使用せずにdocker-systemctl-交換完全にスクリプト化されました。
この場合、ユーザーモードはコンテナが「USER =」設定で実行され、すべてのプロセスをルートではなく所有者にプッシュするため、異なる意味を持ちます。これはいくつかの docker-cloud 実装の要件です。例は以下にあります。ドッカー-systemctl-画像