GNU/Linux >> Znalost Linux >  >> Linux

Jak zkopírovat soubory z dockerfile na hostitele?

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:

  1. Nastavte proměnnou prostředí DOCKER_BUILDKIT=1 nebo
  2. 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"

Linux
  1. Jak rekurzivně kopírovat soubory podle přípony souboru?

  2. Jak použít Dockerfile k vytvoření Docker Image

  3. Naučte se kopírovat soubory a složky z/na jiný server

  1. Jak kopírovat více souborů současně pomocí scp

  2. Jak mohu zkopírovat soubory ze serveru Google Cloud Compute Server do svého místního počítače

  3. Jak zabránit procesu v zápisu souborů

  1. Jak najít a zkopírovat určitý typ souborů z jednoho adresáře do druhého v Linuxu

  2. Jak zkopírovat soubory z Wine na plochu?

  3. Jak zkopíruji text ze svého xtermu bez myši?