To je nyní možné, protože Docker 19.03.0 v červenci 2019 zavedl „vlastní výstupy sestavení“. Podívejte se na oficiální dokumenty o vlastních výstupech sestavení.
Chcete-li během procesu sestavování povolit vlastní výstupy sestavení z bitové kopie sestavení do hostitele, musíte aktivovat BuildKit což je novější doporučený zpětně kompatibilní způsob, jak motor provést fázi sestavení. Podívejte se na oficiální dokumentaci pro povolení BuildKit.
To lze provést dvěma způsoby:
- Nastavte proměnnou prostředí
DOCKER_BUILDKIT=1
nebo - Nastavte jej ve výchozím nastavení v modulu docker přidáním
"features": { "buildkit": true }
do kořenového adresáře config json.
Z oficiálních dokumentů o vlastních výstupech sestavení:
vlastní exportéry umožňují exportovat artefakty sestavení jako soubory do místního souborového systému namísto obrazu Dockeru, což může být užitečné pro generování místních binárních souborů, generování kódu atd.
...
Místní exportér zapíše výsledné soubory sestavení do adresáře na straně klienta. Exportér tar je podobný, ale zapisuje soubory jako jeden tarball (.tar).
Pokud není zadán žádný typ, výchozí hodnota je výstupní adresář místního exportéru.
...
Volba --output exportuje všechny soubory z cílové fáze. Obvyklým vzorem pro exportování pouze konkrétních souborů je provádět vícefázové sestavení a zkopírovat požadované soubory do nové základní fáze pomocí COPY --from.
např. příklad Dockerfile
FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt
FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .
Běh
DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .
Konec výstupu je:
=> [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
=> exporting to client
0.1s
=> => copying files 45B
0.1s
Tím se vytvoří místní soubor out/output.txt
který byl vytvořen RUN
příkaz.
$ cat out/output.txt
hello world
Všechny soubory jsou na výstupu z cílové fáze
--output
možnost exportuje vše soubory z cílové fáze. Takže pomocí nepoškrábané fáze s COPY --from
způsobí zkopírování nadbytečných souborů do výstupu. Doporučuje se použít fázi scratch s COPY --from
.
Kopírování souborů „ze souboru Dockerfile“ na hostitele není podporováno. Dockerfile je pouze recept, který určuje, jak vytvořit obrázek.
Při sestavování máte možnost zkopírovat soubory z hostitele do obrazu, který vytváříte (s COPY
direktiva nebo ADD
)
Můžete také kopírovat soubory z kontejneru (obrázek, který byl docker run
'd) na hostitele pomocí docker cp (ve skutečnosti může cp kopírovat také z hostitele do kontejneru)
Pokud se chcete vrátit k vašemu hostiteli některé soubory, které mohly být vygenerovány během sestavování (jako například volání skriptu, který generuje ssl), můžete spustit kontejner, připojit složku z vašeho hostitele a spustit příkazy cp.
Viz například tento skript 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
Vše mezi COMMANDS
jsou příkazy prováděné na kontejneru, včetně cp
ty, které se kopírují na hostiteli ${HOME}/b2d/apache
složku připojenou v kontejneru jako /apache
s -v ${HOME}/b2d/apache:/apache
.
To znamená pokaždé, když něco zkopírujete na /apache
v kontejneru, ve skutečnosti kopírujete v ${HOME}/b2d/apache
na hostiteli!
Ačkoli to není přímo podporováno prostřednictvím Dockerfile
můžete kopírovat soubory z vytvořeného obrazu dockeru.
containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"