web-dev-qa-db-fra.com

Comment démarrer le démon Docker for Mac au démarrage?

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.

20
John

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

Tentative avec Docker pour Mac

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.

20
Matt