Questo è ora possibile poiché Docker 19.03.0 a luglio 2019 ha introdotto "output di build personalizzati". Consulta i documenti ufficiali sugli output di build personalizzati.
Per abilitare gli output di build personalizzati dall'immagine di build nell'host durante il processo di build, devi attivare il BuildKit che è un nuovo modo retrocompatibile consigliato per il motore per eseguire la fase di costruzione. Consulta i documenti ufficiali per l'abilitazione di BuildKit.
Questo può essere fatto in 2 modi:
- Imposta la variabile d'ambiente
DOCKER_BUILDKIT=1
o - Impostalo nel motore docker per impostazione predefinita aggiungendo
"features": { "buildkit": true }
alla radice del json di configurazione.
Dai documenti ufficiali sugli output di build personalizzati:
gli esportatori personalizzati ti consentono di esportare gli artefatti della build come file sul filesystem locale invece di un'immagine Docker, che può essere utile per generare file binari locali, generazione di codice ecc.
...
L'esportatore locale scrive i file di build risultanti in una directory sul lato client. L'esportatore tar è simile ma scrive i file come un singolo tarball (.tar).
Se non viene specificato alcun tipo, il valore predefinito è la directory di output dell'esportatore locale.
...
L'opzione --output esporta tutti i file dalla fase di destinazione. Un modello comune per esportare solo file specifici è eseguire build in più fasi e copiare i file desiderati in una nuova fase iniziale con COPY --from.
per esempio. un Dockerfile di esempio
FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt
FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .
In esecuzione
DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
La coda dell'output è:
=> [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
=> exporting to client
0.1s
=> => copying files 45B
0.1s
Questo produce un file locale out/output.txt
creato dal RUN
comando.
$ cat out/output.txt
hello world
Tutti i file vengono emessi dalla fase di destinazione
Il --output
l'opzione esporterà tutto file dalla fase di destinazione. Quindi, utilizzando uno stage non scratch con COPY --from
causerà la copia di file estranei nell'output. La raccomandazione è di utilizzare una fase iniziale con COPY --from
.
Copiare i file "dal Dockerfile" all'host non supportato. Il Dockerfile è solo una ricetta che specifica come costruire un'immagine.
Quando crei, hai la possibilità di copiare i file dall'host all'immagine che stai creando (con il COPY
direttiva o ADD
)
Puoi anche copiare i file da un contenitore (un'immagine che è stata docker run
'd) all'host con docker cp (in realtà, cp può anche copiare dall'host al contenitore)
Se vuoi restituire al tuo host alcuni file che potrebbero essere stati generati durante la compilazione (come ad esempio chiamare uno script che genera ssl), puoi eseguire un contenitore, montare una cartella dal tuo host ed eseguire i comandi cp.
Vedi ad esempio questo script getcrt.
docker run -u root --entrypoint=/bin/sh --rm -i -v ${HOME}/b2d/apache:/apache apache << COMMANDS
pwd
cp crt /apache
cp key /apache
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /apache/crt
chown -R $(id -u):$(id -u) /apache/key
COMMANDS
Tutto compreso tra COMMANDS
sono comandi eseguiti sul contenitore, incluso cp
quelli che stanno copiando sull'host ${HOME}/b2d/apache
cartella, montata all'interno del contenitore come /apache
con -v ${HOME}/b2d/apache:/apache
.
Ciò significa che ogni volta che copi qualcosa su /apache
nel contenitore, stai effettivamente copiando in ${HOME}/b2d/apache
sull'host!
Sebbene non sia direttamente supportato tramite Dockerfile
funzionalità, puoi copiare i file da un'immagine docker creata.
containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"