如何在启动时启动Docker for Mac守护进程?

我想让Docker for Mac在启动时启动,而不是login。 我该怎么做呢? 我想创build一个LaunchDaemon,我只是不知道什么程序开始。

我所看到的所有例子似乎都使用docker-machine来定义一个虚拟机,但是文档现在说Docker docker-machine如果要使用安装Docker时创build的默认虚拟docker-machine ,现在不是要走的路,因为Docker for Mac不使用docker-machine来创build虚拟机。

原因是我想启动Docker在启动时运行Jenkins和Nexus容器,因为服务器将被用作CI服务器。 Docker GUI具有开始login的优先选项,这与启动时不一样。

我正在运行OSX Sierra。

tl; dr通过创build一个普通的VM或使用docker-machine ,在一个VirtualBox VM中运行Docker会更容易。 然后将VM设置为在启动时运行

Docker for Mac

Docker for Mac应用程序创build一个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是位于托盘中的GUI应用程序,而不是虚拟机,因此在启动时很难运行。 第一个后代/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux看起来更像是pipe理虚拟机的东西,所以我们将从这里开始。

获取hyperkit进程的完整命令

 ○→ 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 

创build一个包含详细信息的启动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 ,它将成为hyperkit进程的stdin ,所以可能会丢失一些东西。

如果我再次正常运行Docker,并在hyperkit进程运行时查看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进程已经为许多进程打开了pipe道。

 ○→ 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应用程序执行一些运行虚拟机所需的设置。 我一直无法findwatchdog选项的源代码,所以不知道它的期望。

也许在https://github.com/docker/for-mac上提出问题或function请求,以获取从应用程序运行VM独立的详细信息&#x3002;