web-dev-qa-db-ja.com

ブート時にDocker for Macデーモンを起動する方法は?

ログインではなく起動時にDocker for Macを起動したい。どうすればよいですか? LaunchDaemonを作成したいのですが、開始するプログラムがわかりません。

私が目にするすべての例では、VMを定義するためにdocker-machineを使用しているようですが、ドキュメントでは、デフォルトでVM Dockerのインストール時に作成した場合、docker-machineを使用する方法がなくなったと説明しています。 、Docker for MacはVMの作成にdocker-machineを使用しないためです。

その理由は、サーバーがCIサーバーとして使用されるため、Dockerを起動して、起動時にJenkinsおよびNexusコンテナーを実行したいからです。 Docker GUIには、ログイン時に開始する設定オプションがあります。これは、ブート時とは異なります。

OSX Sierraを実行しています。

20
John

tl; dr Docker for Macではサポートされていません。プレーンなVMを作成するか、docker-machineを使用して、VirtualBox VMでDockerを実行します。 その後、VM起動時

Docker for Macで試す

Docker for Macアプリケーションは、launchdサービスを作成します。

○→ launchctl list | grep -i docker
-   0   com.docker.helper
78105   0   com.docker.docker.52512

このサービスには次の詳細があります。

○→ launchctl list com.docker.docker.52512
{
    "LimitLoadToSessionType" = "Aqua";
    "Label" = "com.docker.docker.52512";
    "TimeOut" = 30;
    "OnDemand" = true;
    "LastExitStatus" = 0;
    "PID" = 78105;
    "Program" = "/Applications/Docker.app/Contents/MacOS/Docker";
    "ProgramArguments" = (
        "/Applications/Docker.app/Contents/MacOS/Docker";
    );
    "PerJobMachServices" = {
        "com.Apple.tsm.portname" = mach-port-object;
        "com.Apple.CFPasteboardClient" = mach-port-object;
        "com.Apple.coredrag" = mach-port-object;
        "com.Apple.axserver" = mach-port-object;
    };
};

また、次のプロセスツリーがあります。

○→ pstree -p 78105
-+= 00001 root /sbin/launchd
 \-+= 78105 matt /Applications/Docker.app/Contents/MacOS/Docker
   \-+= 78118 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30
     |--- 78119 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30
     |--= 78120 matt com.docker.db --url fd://3 --git /Users/matt/Library/Containers/com.docker.docker/Data/database
     |--= 78121 matt com.docker.osxfs --address fd:3 --connect /Users/matt/Library/Containers/com.docker.docker/Data/@connect --control fd:4 --volume-control
     |--= 78122 matt com.docker.slirp --db /Users/matt/Library/Containers/com.docker.docker/Data/s40 --ethernet fd:3 --port fd:4 --introspection fd:5 --diagn
     |-+= 78123 matt com.docker.osx.hyperkit.linux
     | \--- 78125 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux
     \-+= 78124 matt com.docker.driver.AMD64-linux -db /Users/matt/Library/Containers/com.docker.docker/Data/s40 -osxfs-volume /Users/matt/Library/Containers
       |--- 78126 matt /Applications/Docker.app/Contents/MacOS/com.docker.driver.AMD64-linux -db /Users/matt/Library/Containers/com.docker.docker/Data/s40 -o
       \--- 78130 matt /Applications/Docker.app/Contents/MacOS/com.docker.hyperkit -A -m 2048M -c 3 -u -s 0:0,hostbridge -s 31,lpc -s 2:0,virtio-vpnkit,uuid=

最初の問題は/Applications/Docker.app/Contents/MacOS/DockerがVMではなくトレイに配置されるGUIアプリであるため、起動時に実行するのが困難になります。最初の子孫/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linuxは、VMを管理するものに似ているため、ここから始めます。

ハイパーキットプロセスの完全なコマンドを取得する

○→ ps -fp 78105
  UID   PID  PPID   C STIME   TTY           TIME CMD
  501 78105 82644   0  2:08am ??         0:00.03 /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30

プロセスの作業ディレクトリを取得します

○→ Sudo lsof -p 78105 | grep cwd
com.docke 78105 matt  cwd      DIR                1,4       748 63186601 /Users/matt/Library/Containers/com.docker.docker/Data

詳細を含むlaunchd plistファイル/Library/LaunchDaemons/com.you.docker.plistを作成します

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
    <string>com.you.docker</string>
  <key>ProgramArguments</key>
    <array>
      <string>/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux</string>
      <string>-watchdog</string>
      <string>fd:0</string>
      <string>-max-restarts</string>
      <string>5</string>
      <string>-restart-seconds</string>
      <string>30</string>
    </array>
  <key>UserName</key>
    <string>youruser</string>
  <key>WorkingDirectory</key>
    <string>/Users/youruser/Library/Containers/com.docker.docker/Data</string>
  <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

あなたがロードできるもの

Sudo launchctl load -w /Library/LaunchDaemons/com.you.docker.plist

その後...何も。ログを確認する

○→ tail /var/log/system.log
Mar  7 02:23:26 mac Docker[87728]: Acquired task manager lock
Mar  7 02:23:26 mac Docker[87728]: Maximum number of file descriptors is 10240
Mar  7 02:23:26 mac Docker[87728]: Failed to read watchdog handshake
Mar  7 02:23:26 mac com.Apple.xpc.launchd[1] (com.you.docker[87728]): Service exited with abnormal code: 1

実行中のコマンドがオプション-watchdog fd:0を指定していることがわかります。これは、ハイパーキットプロセスのstdinになるため、おそらく何か不足しています。

Dockerを通常どおり再度実行し、ハイパーキットプロセスが機能しているときにFD 0が何であるかを確認した場合

○→ Sudo lsof -p 88360
COMMAND     PID USER   FD     TYPE             DEVICE  SIZE/OFF     NODE NAME
com.docke 88360 matt    0     PIPE 0xff80ce577ca2ed91     16384          ->0xff80ce5776aa8d51

次に、システム全体でPIPE 0xff80ce577ca2ed91を見ると、メインのDockerプロセスが多くのプロセスに対してパイプを開いていることがわかります。

○→ Sudo lsof | grep 0xff80ce577ca2ed91
COMMAND     PID             USER   FD      TYPE             DEVICE    SIZE/OFF     NODE NAME
Docker    88349             matt   13      PIPE 0xff80ce5776aa8d51       16384          ->0xff80ce577ca2ed91
com.docke 88360             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88362             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88363             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88364             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88365             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88366             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51

-watchdog fd:0オプションなしでサービスを再度ロードしようとすると、同じエラーが発生します。

したがって、メインのDockerアプリがVMの実行に必要ないくつかの設定を行うように見えます。私はwatchdogオプションを扱っているもののソースコードを見つけることができなかったので、それが何を期待しているのかわかりません。

https://github.com/docker/for-mac で問題または機能のリクエストを発行して、VMスタンドアロンでアプリケーションを実行する方法の詳細を取得してください。

20
Matt