2014-12-09 13 views
5

Sto utilizzando Docker per scrivere un file al volo ed eseguirlo. Il comando si presenta così finora (solo per testare l'idea prima):Esecuzione di un comando più lungo dalla finestra mobile

docker run dockerfile/python cat <<EOF >hi.txt && tail hi.txt 
> hi there 
> EOF 

Per qualche ragione questo non eco nulla.

Se eseguo questo comando senza HEREDOC, emette il risultato. Ad esempio, i seguenti lavori:

docker run dockerfile/python cat > hi.txt && ls 
hi.txt 

Come output il risultato di un comando di esecuzione su più righe/HEREDOC.

risposta

3

Sono curioso, quale shell stai usando in modo che il secondo comando funzioni? Perché in bash lo hi.txt viene creato sull'host e lo è anche lo ls.

bash-3.2$ docker run --rm dockerfile/python cat > hi.txt && ls 
Applications Desktop  Documents Downloads Dropbox  Library  Movies  Music  Pictures Public  VirtualBox VMs hi.txt  projects 

A tal fine, avrei dovuto usare:

docker run --rm dockerfile/python bash -c 'cat > hi.txt && ls' 

IMO, il modo più semplice per testare roba è usare solo un contenitore come una sandbox:

docker run -it dockerfile/python bash 

E poi basta fare cose nella shell di quel contenitore. Una volta che ho fatto funzionare bene le cose, eseguo il backport di ciò che ho fatto in un Dockerfile.

2

Stavo armeggiando con crossbuild * e mi chiedevo come utilizzare qui documenti per inviare comandi a un contenitore Docker. Ecco la soluzione.

$ docker run --rm --interactive --volume $(pwd):/workdir --env CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild /bin/bash -s <<EOF 
mkdir build && cd build 
cmake .. 
make 
EOF 

Rapido riassunto di ciò che sta accadendo.

  • --rm dice Docker per rimuovere il contenitore quando è finito esecuzione, altrimenti avrebbe mostrato nell'output docker ps -a (non obbligatorio usare ovviamente)
  • --interactive, -i è necessario, tuttavia /bin/bash non correrebbe in un ambiente interattivo e non avrebbero accettato il documento qui da stdin come input
  • sulla bandiera -s passato a /bin/bash

    Se esimo L'opzione e -s è presente, o se non rimangono argomenti dopo l'elaborazione dell'opzione , i comandi vengono letti dallo standard input.

  • --volume $(pwd):/workdir, basta -v viene installata la directory di lavoro corrente sull'host per /workdir nel contenitore
  • --env CROSS_TRIPLE=x86_64-apple-darwin, o semplice -e dice il contenitore crossbuild sulla piattaforma di destinazione e l'architettura (punto di ingresso del contenitore è /usr/bin/crossbuild, che è uno script di shell e in base alla variabile di ambiente è symlink i componenti di toolchain giusti per i posti giusti affinché la compilazione incrociata funzioni)
  • multiarch/crossbuild il nome del contenitore Docker da eseguire (disponibile in Docker Hub)

I comandi possono essere inseriti anche in Docker come questo.

$ cat a.sh 
mkdir build && cd build 
cmake .. 
make 
$ docker run --rm -i -v $(pwd):/workdir -e CROSS_TRIPLE=x86_64-apple-darwin multiarch/crossbuild /bin/bash -s < a.sh 

Spero che questo aiuti.

Aggiornamento

In realtà sembra che non hanno nemmeno bisogno di usare /bin/bash -s, può essere ommited, almeno per il contenitore crossbuild, YMMV.

* Contenitore basato su Linux utilizzato per produrre binari a più archi: Linux, Windows e OS X, molto interessante.

Problemi correlati