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.
fonte
2016-03-03 09:05:36