Je suis nouveau dans le monde des dockers. Je dois invoquer un script shell qui prend des arguments de ligne de commande via un conteneur docker. Ex: Mon script shell ressemble à:
#!bin/bash
echo $1
Dockerfile ressemble à ceci:
FROM ubuntu:14.04
COPY ./file.sh /
CMD /bin/bash file.sh
Je ne sais pas comment transmettre les arguments lors de l'exécution du conteneur
bash
shell
docker
command-line-arguments
Akash Mehta
la source
la source
docker run -ti test /file.sh abc
. Je pense que le script ne fonctionnera pas parce qu'il devrait l'êtredocker run -ti test sh /file.sh abc
. sh ou / bin / sh l'exécutera correctement.avec ce script dans
file.sh
et ça
Dockerfile
tu devrais être capable de:
la source
ENTRYPOINT ./file.sh
chmod +x file.sh
de définir l'indicateur exécutable.["/file.sh"]
et/file.sh
ou même[/file.sh]
Avec Docker, la bonne façon de transmettre ce type d'informations consiste à utiliser des variables d'environnement.
Donc, avec le même Dockerfile, changez le script en
Après la construction, utilisez la commande docker suivante:
la source
Il y a plusieurs choses qui interagissent ici:
docker run your_image arg1 arg2
remplacera la valeur deCMD
pararg1 arg2
. C'est un remplacement complet du CMD, sans lui ajouter plus de valeurs. C'est pourquoi vous voyez souventdocker run some_image /bin/bash
exécuter un shell bash dans le conteneur.Lorsque vous avez défini à la fois un ENTRYPOINT et une valeur CMD, docker démarre le conteneur en concaténant les deux et en exécutant cette commande concaténée. Donc, si vous définissez votre point d'entrée comme étant
file.sh
, vous pouvez maintenant exécuter le conteneur avec des arguments supplémentaires qui seront transmis en tant qu'arguments àfile.sh
.Les points d'entrée et les commandes dans le menu fixe ont deux syntaxes, une syntaxe de chaîne qui lancera un shell et une syntaxe json qui exécutera un exec. Le shell est utile pour gérer des choses comme la redirection IO, l'enchaînement de plusieurs commandes (avec des choses comme
&&
), la substitution de variables, etc. un conteneur, c'est souvent la cause) et avec la concaténation d'un point d'entrée et d'une commande ensemble. Si vous définissez votre point d'entrée comme une chaîne, il s'exécuterait/bin/sh -c "file.sh"
, ce qui seul convient. Mais si vous avez également une commande définie comme une chaîne, vous verrez quelque chose comme/bin/sh -c "file.sh" /bin/sh -c "arg1 arg2"
la commande lancée à l'intérieur de votre conteneur, pas si bon. Consultez le tableau ici pour en savoir plus sur l'interaction de ces deux optionsL'
-c
option shell ne prend qu'un seul argument. Tout après qui se passé comme$1
,$2
, etc., à cet argument unique, mais pas dans un script shell intégré , sauf si vous avez passé explicitement les args. Ie/bin/sh -c "file.sh $1 $2" "arg1" "arg2"
fonctionnerait, mais/bin/sh -c "file.sh" "arg1" "arg2"
ne le ferait pas depuisfile.sh
serait appelé sans argument.En mettant tout cela ensemble, la conception commune est:
Et vous exécutez ensuite cela avec:
Il y a un peu plus de détails à ce sujet sur:
la source
["bash", "--login", "-c"]
pour obtenir la source / etc / profile dans l'image, mais je me suis ensuite demandé pourquoi aucun argument ne serait passé à un script shell passé à docker run ... Votre réponse a clarifié cela, merci !Ce que j'ai est un fichier de script qui exécute réellement les choses. Ce fichier script peut être relativement compliqué. Appelons cela "run_container". Ce script prend les arguments de la ligne de commande:
Un simple run_container pourrait être:
Ce que je veux faire, c'est qu'après "docker" ceci, je voudrais pouvoir démarrer ce conteneur avec les paramètres de la ligne de commande docker comme ceci:
et faites exécuter le script run_container avec p1 p2 p3 comme paramètres.
Voici ma solution:
Dockerfile:
la source
ENTRYPOINT
tableau par des"/run_container \"$@\""
moyens que les arguments contenant des espaces sont gérés correctement (par exempledocker run image_name foo 'bar baz' quux
).Si vous voulez l'exécuter à l'heure de construction:
si vous voulez l'exécuter à l'heure de l'exécution:
Puis dans le shell hôte
la source
ENTRYPOINT
est une bonne réponse pour l'OP qui, je pense, voulait un runtime, mais si vous voulez vraiment des variables de temps de construction, cette réponse est tout simplement cassée. UtilisezARG
etdocker build --build-arg
docs.docker.com/engine/reference/builder/#argUne autre option...
Pour que cela fonctionne
dans dockerfile
dans entrypoint.sh
la source