42
votes

Réponse d'erreur du démon: Erreur d'analyse Dockerfile Indicateur inconnu: montage

Il y a une question précédente ( indicateur Docker inconnu --mount ) face à la même erreur qui était due à l'exécution d'une version obsolète de Docker. J'ai une version à jour de Docker en cours d'exécution.

J'ai le Dockerfile suivant:

Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

D'après la documentation , je devrais pouvoir exécuter simplement docker build --ssh default . . Cependant, je reçois l'erreur suivante:

Sending build context to Docker daemon  2.048kB
Error response from daemon: Dockerfile parse error line 3: Unknown flag: mount

Sortie de la docker version :

FROM continuumio/miniconda3

RUN --mount=type=ssh pip install git+ssh://git@github.com/myrepo/myproject.git@develop
RUN conda install numpy
...

Je voudrais créer une image Docker sans exposer mes informations d'identification SSH privées, et cela semblait être la méthode prise en charge. Quelqu'un a-t-il une idée de la cause du problème?


2 commentaires

Juste un avertissement à tous ceux qui essaient de faire fonctionner cette fonctionnalité: au moment d'écrire ces lignes, si vous exécutez Docker à partir d'un Mac (ou Windows, je suppose), vous ne pouvez pas passer votre client SSH au conteneur Docker pendant le processus de construction, donc cette fonctionnalité ne fonctionnera pas pour vous.


La réponse de @ Thomasleveil est excellente, même si j'ai également dû mettre à niveau docker-compose de 1.24.0 à 1.26.2 avant de pouvoir faire fonctionner cela.


3 Réponses :


2
votes

Le message d'erreur que vous obtenez en raison de l'écriture de --mount dans le Dockerfile . Vous devez d'abord activer Docker BuildKit pour utiliser cette syntaxe.

Vous pouvez vérifier toutes les options de construction actuellement disponibles ici


2 commentaires

Dommage que pour le moment les commandes Bocker BuildKit ne soient pas disponibles via Docker Compose. github.com/docker/compose/issues/6440


@AlexisWilke Une bonne utilisation de Buildkit en général est possible avec Docker Compose. Exécutez-le simplement avec: COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build . Il semble que les arguments spéciaux --mount tels que les secrets de construction ( github.com/docker/compose/pull/7046 ) ou ssh ( github.com/docker/compose/issues/7252 ) n'en font pas encore partie.



78
votes

tl; dr

Dockerfile

DOCKER_BUILDKIT=1 docker build --ssh default -t my_image .

Remarque: le commentaire sur la première ligne est obligatoire vaudou

Ensuite, construisez votre image docker avec:

# syntax=docker/dockerfile:experimental
FROM continuumio/miniconda3

RUN --mount=type=ssh pip install git+ssh://git@github.com/myrepo/myproject.git@develop
RUN conda install numpy
...

Avec cela, vous pourrez utiliser l' option --mount pour la directive RUN dans votre Dockerfile.


Longue réponse

Comme indiqué dans la documentation ici , le transfert ssh lors de la création d'une image docker est activé uniquement lors de l'utilisation du backend BuildKit :

Fonctionnalités de mise en œuvre externe

Cette fonctionnalité n'est disponible que lors de l'utilisation du backend BuildKit .

La version Docker prend en charge des fonctionnalités expérimentales telles que les montages de cache, les secrets de construction et le transfert ssh qui sont activés à l'aide d'une implémentation externe du générateur avec une directive de syntaxe. Pour en savoir plus sur ces fonctionnalités, reportez - vous à la documentation du référentiel BuildKit .

Pour cela, vous avez besoin de Docker 18.09 (ou version ultérieure) et vous devez également exécuter la commande docker build avec la variable d'environnement DOCKER_BUILDKIT=1 et démarrer votre fichier Docker avec le commentaire magique suivant : # syntax=docker/dockerfile:experimental .


5 commentaires

Merci pour la réponse. J'ai essayé ceci et j'ai obtenu une nouvelle erreur: failed to create LLB definition: Dockerfile parse error line 3: Unknown flag: mount .


Il s'avère que j'ai dû mettre l'en-tête suivant dans mon Dockerfile: # syntax=docker/dockerfile:1.0.0-experimental . Je reçois maintenant un échec lors de la vérification de la clé de l'hôte. Faire des progrès!


oh, j'ai manqué ça, je mettrai à jour ma réponse pour qu'elle soit plus claire pour les futurs lecteurs


2 heures, 2 heures et enfin j'ai besoin de mettre ce commentaire dans mon Dockerfile # syntax=docker/dockerfile:experimental


Cette réponse devrait avoir beaucoup plus d'appréciation.



7
votes

Si vous utilisez sudo pour les commandes docker, vous aurez peut-être besoin de:

sudo DOCKER_BUILDKIT=1 ...


1 commentaires

Et utiliser la variable sudo after ne fonctionne pas haha juste des heures perdues avant de s'en rendre compte.