2015-09-22 19 views
33

Sono nuovo al mondo docker. Devo invocare uno script di shell che accetta gli argomenti della riga di comando attraverso un contenitore di finestra mobile. Es: Il mio script di shell assomiglia:Come passare argomenti a Shell Script tramite la finestra mobile Esegui

#!bin/bash 
echo $1 

Dockerfile assomiglia a questo:

FROM ubuntu:14.04 
COPY ./file.sh/
CMD /bin/bash file.sh 

Non sono sicuro di come passare gli argomenti durante l'esecuzione del contenitore

risposta

26

@ user1801934, sei sicuro che la risposta di @Gilles Quenot è corretta?

metti direttamente l'arg1 in Dockerfile, è quella la tua richiesta?

Ecco la mia risposta.

Aggiornamento file.sh

#!/usr/bin/env bash 
echo $1 

utilizzando l'esistono Dockerfile

generi l'immagine:

docker build -t test . 

eseguire l'immagine con l'argomento abc o xyz o qualcos'altro.

docker run -ti test /file.sh abc 

docker run -ti test /file.sh xyz 
+3

Penso che ENTRYPOINT sia la strada da percorrere se non vuoi la fine- utente di sapere direttamente su file.sh. –

+0

Come puoi iniziare uno script come questo 'docker run -ti test /file.sh abc'. Sento che lo script non verrà eseguito perché dovrebbe essere 'docker run -ti test sh /file.sh abc'. sh o/bin/sh lo eseguirà correttamente. –

+0

Per chiunque altro venga qui. Il trucco/usr/bin/env è una preferenza di stile opzionale, non un requisito per farlo funzionare. Anche il #! la linea indica quale interprete usare default di acquisto. Quindi può essere eseguito semplicemente chiamando lo script. – wheredidthatnamecomefrom

4

Se si desidera eseguire it tempo @build:

CMD /bin/bash /file.sh arg1 

se si desidera eseguirlo @ tempo di esecuzione:

ENTRYPOINT ["/bin/bash"] 
CMD ["/file.sh", "arg1"] 

Poi nel guscio di accoglienza

docker build -t test . 
docker run -i -t test 
+1

'ENTRYPOINT' è una buona risposta per il PO che credo runtime desiderato, ma se si vuole veramente costruire variabili di tempo questa risposta solo è rotto. Usa 'ARG' e' docker build --build-arg' https://docs.docker.com/engine/reference/builder/#arg –

35

Con Docker, il modo corretto per passare questo tipo di informazioni è attraverso le variabili di ambiente.

Quindi, con lo stesso Dockerfile, modificare lo script per

#!/bin/bash 
echo $FOO 

Dopo la costruzione, utilizzare il seguente comando finestra mobile:

docker run -e FOO="hello world!" test 
+7

Perché questa è la risposta più votata? Env vars sono un altro modo per passare informazioni, ma non è quello che l'OP sta chiedendo. E ovviamente non c'è assolutamente nulla di improprio nel desiderio di OP di passare args al contenitore. –

+2

@PartlyCloudy Penso che la gente piaccia perché pretende di dare la risposta "corretta", nonostante sia ovviamente sbagliato. Uno dei principali principi di progettazione di Docker è dare la priorità al dogma rispetto al buon senso. – augurar

11

Quello che ho è un file di script che esegue effettivamente le cose. Questo file script potrebbe essere relativamente complicato. Chiamiamolo "run_container".Questo script prende argomenti da linea di comando:

run_container p1 p2 p3 

Una semplice run_container potrebbe essere:

#!/bin/bash 
echo "argc = ${#*}" 
echo "argv = ${*}" 

Quello che voglio fare è, dopo "dockering" questo mi piacerebbe essere in grado di avvio presente contenitore con i parametri sulla linea di comando finestra mobile come questo:

docker run image_name p1 p2 p3 

e hanno lo script run_container essere eseguito con p1 p2 p3 come parametri.

Questa è la mia soluzione:

Dockerfile:

FROM docker.io/ubuntu 
ADD run_container/
ENTRYPOINT ["/bin/bash", "-c", "/run_container ${*}", "--"] 
+4

Sostituendo il terzo valore nella matrice 'ENTRYPOINT' con' "/ run_container \" $ @ \ "" "significa che gli argomenti contenenti spazi sono gestiti correttamente (ad esempio' docker eseguire image_name foo 'bar baz' quux'). – davidchambers

25

con questo script in file.sh

#!/bin/bash 
echo Your container args are: "[email protected]" 

e questo Dockerfile

FROM ubuntu:14.04 
COPY ./file.sh/
ENTRYPOINT ["/file.sh"] 
CMD [] 

si dovrebbe essere in grado di:

% docker build -t test . 
% docker run test hello world 
Your container args are: hello world 
+1

Se si dimentica il "" giro "/file.sh" come ho fatto, non funzionerà. – kev

Problemi correlati