GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo copiar archivos de dockerfile a host?

Esto ahora es posible desde que Docker 19.03.0 en julio de 2019 introdujo "salidas de compilación personalizadas". Consulte los documentos oficiales sobre salidas de compilación personalizadas.

Para habilitar las salidas de compilación personalizadas desde la imagen de compilación en el host durante el proceso de compilación, debe activar el BuildKit que es una nueva forma compatible con versiones anteriores recomendada para que el motor realice la fase de construcción. Consulte los documentos oficiales para habilitar BuildKit.

Esto se puede hacer de 2 maneras:

  1. Establezca la variable de entorno DOCKER_BUILDKIT=1 , o
  2. Configúrelo en el motor acoplable de forma predeterminada agregando "features": { "buildkit": true } a la raíz de la configuración json.

De los documentos oficiales sobre salidas de compilación personalizadas:

Los exportadores personalizados le permiten exportar los artefactos de compilación como archivos en el sistema de archivos local en lugar de una imagen de Docker, lo que puede ser útil para generar archivos binarios locales, generación de código, etc.

...

El exportador local escribe los archivos de compilación resultantes en un directorio del lado del cliente. El exportador tar es similar pero escribe los archivos como un único tarball (.tar).

Si no se especifica ningún tipo, el valor predeterminado es el directorio de salida del exportador local.

...

La opción --output exporta todos los archivos desde la etapa de destino. Un patrón común para exportar solo archivos específicos es hacer compilaciones de varias etapas y copiar los archivos deseados a una nueva etapa temporal con COPY --from.

p.ej. un Dockerfile de ejemplo

FROM alpine:latest AS stage1
WORKDIR /app
RUN echo "hello world" > output.txt

FROM scratch AS export-stage
COPY --from=stage1 /app/output.txt .

Corriendo

DOCKER_BUILDKIT=1 docker build --file Dockerfile --output out .

La cola de la salida es:

 => [export-stage 1/1] COPY --from=stage1 /app/output.txt .
0.0s
 => exporting to client
0.1s
 => => copying files 45B
0.1s

Esto produce un archivo local out/output.txt que fue creado por el RUN comando.

$ cat out/output.txt
hello world

Todos los archivos salen de la etapa de destino

El --output la opción exportará todos archivos de la etapa de destino. Entonces, usando una etapa sin scratch con COPY --from hará que los archivos extraños se copien en la salida. La recomendación es usar una etapa scratch con COPY --from .


Copiar archivos "desde Dockerfile" al host no soportado. El Dockerfile es solo una receta que especifica cómo construir una imagen.

Cuando crea, tiene la oportunidad de copiar archivos del host a la imagen que está creando (con el COPY directiva o ADD )

También puede copiar archivos desde un contenedor (una imagen que ha sido docker run 'd) al host con docker cp (en realidad, el cp también puede copiar desde el host al contenedor)

Si desea devolver a su host algunos archivos que podrían haberse generado durante la compilación (como, por ejemplo, llamar a un script que genera ssl), puede ejecutar un contenedor, montar una carpeta desde su host y ejecutar comandos cp.

Vea por ejemplo este 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

Todo entre COMMANDS son comandos que se ejecutan en el contenedor, incluidos cp los que se copian en el host ${HOME}/b2d/apache carpeta, montada dentro del contenedor como /apache con -v ${HOME}/b2d/apache:/apache .

Eso significa que cada vez que copias algo en /apache en el contenedor, en realidad estás copiando en ${HOME}/b2d/apache en el host!


Aunque no es compatible directamente a través de Dockerfile funcionalidad, puede copiar archivos desde una imagen acoplable integrada.

containerId=$(docker create example:latest)
docker cp "$containerId":/source/path /destination/path
docker rm "$containerId"

Linux
  1. ¿Cómo copiar archivos recursivamente por extensión de archivo?

  2. ¿Cómo copio texto de mi xterm sin un mouse?

  3. ¿Cómo copiar los 10 archivos más recientes de un directorio a otro?

  4. Cómo copiar texto de menos

  5. Cómo evitar que un proceso escriba archivos

Cómo copiar una gran cantidad de archivos en Linux

Cómo descargar archivos desde servidores Linux remotos

Cómo copiar archivos en Linux usando el comando CP

Cómo construir el kernel de Linux desde cero

Cómo usar Docker Cp para copiar archivos entre el host y los contenedores

Cómo copiar archivos entre el host y el contenedor Docker