Je veux que Docker pour Mac démarre au démarrage, pas à la connexion. Comment puis-je faire cela? Je voudrais créer un LaunchDaemon, je ne sais tout simplement pas quel programme démarrer.
Tous les exemples que je vois semblent utiliser docker-machine
pour définir une machine virtuelle, mais la documentation indique maintenant que docker-machine
n'est plus la voie à suivre si vous souhaitez utiliser la valeur par défaut VM créée lors de l'installation de Docker, car Docker pour Mac n'utilise pas docker-machine
pour créer la VM.
La raison en est que je veux démarrer Docker pour exécuter les conteneurs Jenkins et Nexus au démarrage, car le serveur va être utilisé comme serveur CI. L'interface graphique Docker a l'option de préférence de démarrer à la connexion, ce qui n'est pas la même chose qu'au démarrage.
J'utilise OSX Sierra.
tl; dr Il n'est pas pris en charge dans Docker pour Mac. Exécutez Docker dans une machine virtuelle VirtualBox, soit en créant un simple VM ou en utilisant docker-machine
. Ensuite, définissez le VM à exécuter au démarrage
L'application Docker pour Mac crée un service launchd:
○→ launchctl list | grep -i docker
- 0 com.docker.helper
78105 0 com.docker.docker.52512
Le service contient les détails suivants:
○→ 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;
};
};
Et a l'arborescence de processus suivante:
○→ 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=
Le premier problème est /Applications/Docker.app/Contents/MacOS/Docker
est l'application graphique qui se trouve dans votre bac plutôt que sur la machine virtuelle, donc cela va être difficile à exécuter au démarrage. Le premier descendant /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux
ressemble plus à quelque chose qui gère le VM donc nous allons commencer par là.
Obtenez la pleine commande du processus 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
Obtenez le répertoire de travail du processus
○→ Sudo lsof -p 78105 | grep cwd
com.docke 78105 matt cwd DIR 1,4 748 63186601 /Users/matt/Library/Containers/com.docker.docker/Data
Créez un fichier plist launchd /Library/LaunchDaemons/com.you.docker.plist
contenant les détails
<?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>
Avec lequel vous pouvez charger
Sudo launchctl load -w /Library/LaunchDaemons/com.you.docker.plist
Alors ... rien. Vérifiez les journaux
○→ 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
Vous remarquerez que la commande que nous exécutons spécifie une option -watchdog fd:0
qui sera le stdin
du processus hyperkit donc il manque probablement quelque chose.
Si je lance à nouveau Docker normalement et regarde ce qu'est FD 0 pour le processus d'hyperkit quand il fonctionne
○→ Sudo lsof -p 88360
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
com.docke 88360 matt 0 PIPE 0xff80ce577ca2ed91 16384 ->0xff80ce5776aa8d51
Puis en regardant PIPE 0xff80ce577ca2ed91
à travers le système, vous verrez que le processus Docker principal a le canal ouvert pour de nombreux processus.
○→ 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
Nouvelle tentative de chargement du service sans le -watchdog fd:0
options entraîne la même erreur.
Il semble donc que l'application Docker principale effectue une configuration requise pour exécuter la machine virtuelle. Je n'ai pas pu trouver le code source pour tout ce qui concerne l'option watchdog
donc je ne sais pas ce qu'il attend.
Peut-être soulever un problème ou une demande de fonctionnalité sur https://github.com/docker/for-mac pour obtenir les détails de l'exécution de VM standalone from the App.