Tengo un Dockerfile simple que crea un archivo zip y estoy tratando de recuperar el archivo zip una vez que esté listo. Mi Dockerfile se ve así:
FROM ubuntu RUN apt-get update && apt-get install -y build-essentials gcc ENTRYPOINT ["zip","-r","-9"] CMD ["/lib64.zip", "/lib64"]Después de leer los documentos, me parece que algo como esto debería funcionar, pero no puedo hacer que funcione.
docker build -t ubuntu-libs . docker run -d --name ubuntu-libs --mount source=$(pwd)/,target=/lib64.zip ubuntu-libsOtra pregunta secundaria: ¿es posible cambiar el nombre del archivo zip desde la línea de comando?
Esto es diferente a la pregunta duplicada mencionada en los comentarios porque mientras usan cp para copiar archivos desde un contenedor Docker en ejecución, intento montar un directorio en la creación de instancias.
Hay varias maneras de hacer esto.
docker cp <container_hash>:/path/to/zip/file.zip /path/on/host/new_name.zipComo indicaba en su pregunta, también puede montar una ruta desde el contenedor hasta su host. Puede hacer esto especificando en qué parte del host desea que esté el punto de montaje o no especifique dónde está el punto de montaje y deje que Docker elija. Ambos caminos requieren enfoques diferentes.
docker volume create random_volume_name docker run -d --name ubuntu-libs -v random_volume_name:<path/to/mount/in/container> ubuntu-libsEl contenido se ubicará en su host, aquí:
ls -l /var/lib/docker/volumes/random_volume_name/_data/ docker run -d --name ubuntu-libs -v <existing/mount/point/on/host>:<path/to/mount/in/container> ubuntu-libsEsto crea una ubicación limpia/vacía que se comparte según las ubicaciones definidas en el comando. Ahora necesita modificar su Dockerfile para copiar los artefactos a esta ruta, algo como:
FROM ubuntu RUN apt-get update && apt-get install -y build-essentials gcc ENTRYPOINT ["zip","-r","-9"] CMD ["sh", "-c", "/lib64.zip", "/lib64", "cp", "path/to/zip/file.zip", "<path/to/mount/in/container>"]El contenido ahora se ubicará en su host, aquí:
ls -l <existing/mount/point/on/host>Tengo que saludar a @joaofnfernandes desde aquí , que hace un gran trabajo explicando.
Como comentó @ flagg19, debe vincular un directorio a un directorio. Puede crear directorios dentro del contenedor y puede anular los argumentos RUN . Hacer ambas cosas más agregar type=bind conduce a un gran éxito:
docker run -d --rm --mount type=bind,source="$(pwd)",target=/out ubuntu-libs /out/lib64.zip /lib64 O, por supuesto, podría cambiar el comando EJECUTAR de RUN para escribir en /out/lib64.zip en lugar de /lib64.zip :
FROM ubuntu RUN apt-get update && apt-get install -y build-essentials gcc && mkdir /out ENTRYPOINT ["zip","-r","-9"] CMD ["/out/lib64.zip", "/lib64"] docker run -d --rm --mount type=bind,source="$(pwd)",target=/out ubuntu-libs De cualquier manera, recomiendo agregar --rm y deshacerse de --name . No es necesario quedarse con el recipiente después de que esté listo.