web-dev-qa-db-fra.com

eval "$ (docker-machine env par défaut)"

J'ai des problèmes avec le lancement de docker avec docker-compose.

Lorsque j'exécute docker-compose -f dev.yml build Je suit l'erreur>

Building postgres
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.

Cependant, si je lance docker-machine ls, La machine est clairement en place>

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1

J'ai corrigé l'erreur en exécutant eval "$(docker-machine env default)" après quoi docker-compose -f dev.yml build Se termine avec succès.

Ma question pourquoi cela a-t-il fonctionné, que se passe-t-il réellement et comment puis-je l'annuler?

Est-ce également un moyen sûr de résoudre ce problème? Pour l'instant, ce n'est que mon ordinateur portable, mais ces conteneurs sont censés toucher les serveurs de l'entreprise dans un avenir proche.

Je ne maîtrise pas très bien bash mais on m'a toujours dit de ne pas exécuter eval et surtout de ne pas exécuter eval avec "

14
Kimmo Hintikka

Lorsque vous exécutez les commandes docker, la CLI se connecte à l'API du démon Docker, et c'est l'API qui fait le travail. Vous pouvez gérer les hôtes Docker distants à partir de votre CLI locale en modifiant les détails de connexion de l'API, que Docker stocke dans les variables d'environnement sur le client sur lequel la CLI s'exécute.

Avec Docker Machine, votre moteur Docker s'exécute dans une machine virtuelle, qui est en fait une machine distante, de sorte que votre CLI locale doit être configurée pour s'y connecter. Docker Machine connaît les détails de connexion des moteurs qu'il gère, donc exécutant docker-machine env default imprime les détails de la machine default. La sortie est quelque chose comme ceci:

 $ docker-machine env default
 export DOCKER_TLS_VERIFY="1"
 export DOCKER_Host="tcp://172.16.62.130:2376"
 export DOCKER_CERT_PATH="/Users/elton/.docker/machine/machines/default"
 export DOCKER_MACHINE_NAME="default"

L'utilisation de eval exécute chacune de ces commandes export, au lieu de simplement les écrire sur la console, c'est donc un moyen rapide de configurer vos variables d'environnement.

Vous pouvez l'annuler et réinitialiser l'environnement local avec docker-machine env --unset, qui vous donne la sortie pour désactiver l'environnement (donc la CLI va essayer de se connecter au Docker Engine local).

34
Elton Stoneman

C'est en effet la manière attendue d'utiliser Docker sur une machine qui ne prend pas nativement en charge Docker, par ex. sous Windows ou Mac OS X.

La documentation Docker inclut cette étape dans sa description de l'utilisation de Docker Machine ici: https://docs.docker.com/machine/get-started/

Ce que fait cette étape (je vous suggère également de l'essayer vous-même):

  • Courir docker-machine env default.
  • Prenez la sortie de cette commande et exécutez-la dans la session Shell actuelle.

Si vous exécutez docker-machine env default vous-même, vous verrez qu'il suggère simplement de définir certaines variables d'environnement, qui permettent aux commandes Docker de trouver le VM exécutant le démon Docker. Sans ces variables définies, Docker ne sait tout simplement pas comment communiquer avec le démon Docker.

Dans un environnement serveur (Linux), vous n'aurez pas besoin de Docker Machine, car le noyau Linux prend en charge nativement l'exécution de conteneurs. Vous n'avez besoin que de Docker Machine (un petit VM exécutant un noyau Linux) sur les systèmes d'exploitation qui ne prennent pas en charge nativement l'exécution de conteneurs.

5
nwinkler