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:
- Establezca la variable de entorno
DOCKER_BUILDKIT=1
, o - 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"