web-dev-qa-db-fra.com

Comment passer un fichier comme argument pour un fichier docker

En fait, je ne suis pas sûr que cela puisse être fait, mais je sais qu'il y a toujours un bidouillage. Je suis donc enthousiaste pour ce que vos experts vont dire à ce sujet.

je veux passer un paquet comme argument lors de la construction de mon image de menu fixe afin de pouvoir déployer des versions d'applications distinctes avec le même fichier de docker.

Ceci est un exemple de ce que je veux réaliser:
La possibilité de passer package comme argument lors de la construction de l'image (je sais que la syntaxe est fausse, ce n'est qu'un exemple)

 docker build -t myapp/myapp:v1 . package_myapp_v1.tar  

Ensuite, utilisez ADDdans le Dockerfile pour l'extraire dans le conteneur.

ADD passed_package ./ 

Ainsi, si je souhaite créer une image pour la version 2 de mon application, je peux simplement spécifier le nouveau package dans la commande docker build sans modifier le Dockerfile.

Quelqu'un sait quel est le truc pour que ça fonctionne?

Merci :)

7
storm

J'ai réussi à résoudre ce problème après deux minutes de lecture dans doc de docker .

L'instruction ARG définit une variable que les utilisateurs peuvent transmettre au constructeur lors de la construction à l'aide de la commande docker build à l'aide de --build-arg = flag. Si un utilisateur spécifie un argument de construction non défini dans le fichier Docker, la construction génère une erreur.

J'ai donc utilisé cela pour construire mon image

docker build -t myapp/v1 --build-arg package=package_myapp_v1.tar.gz .

Ensuite, pour obtenir le paquet à l'intérieur de Dockerfile, utilisez l'instruction ARG:

ARG package
ADD $package ./

Le contenu de la variable $package est package_myapp_v1.tar.gz et est transmis via la balise package.

10
storm

Il semble que ce soit le contexte qui devrait changer entre les versions, pas le fichier Docker, pas vrai? Quoi qu'il en soit, une solution consiste à utiliser la capacité de Docker à recevoir le contexte en tant que fichier tar (éventuellement gz), avec le fichier Docker à la racine:

tar --create \
    /some/path/to/Dockerfile \
    /other/path/to/package-X.Y.Z.tgz \
    --transform 's,.*/,,' \
    --transform 's/package.*tgz/package.tgz/' |
docker build -t myapp/myapp:v1 -

Remarque:

  • La première transformaplatit la structure de répertoires, de sorte que tous les fichiers apparaissent dans la racine du fichier tarname__, où Docker les attend.

  • La seconde transformsupprime le numéro de version du fichier de package, ce qui vous évite de modifier la ligne ADD package.tgz . dans votre fichier Docker.

1
Matei David