Mi pregunta está relacionada con esta pregunta sobre cómo copiar archivos de contenedores a hosts; Tengo un Dockerfile que busca dependencias, compila un artefacto de compilación desde la fuente y ejecuta un ejecutable. También quiero copiar el artefacto de compilación (en mi caso, es .zip
producido por sbt dist
en '../ target / `, pero creo que esta pregunta también se aplica a jar, binarios, etc.
docker cp
trabaja en contenedores, no en imágenes; ¿Necesito iniciar un contenedor solo para sacar un archivo? En un script, intenté ejecutarlo /bin/bash
en modo interactivo en segundo plano, copiando el archivo y luego matando el contenedor, pero esto parece tonto. ¿Existe una forma mejor?
Por otro lado, me gustaría evitar desempaquetar un .tar
archivo después de ejecutarlo docker save $IMAGENAME
solo para sacar un archivo (pero esa parece la opción más simple, aunque más lenta, en este momento).
Usaría volúmenes de docker, por ejemplo:
docker run -v hostdir:out $IMAGENAME /bin/cp/../blah.zip /out
pero estoy corriendo boot2docker
en OSX y no sé cómo escribir directamente en mi sistema de archivos de host mac (los volúmenes de lectura y escritura se montan dentro de mi máquina virtual boot2docker, lo que significa que no puedo compartir fácilmente un script para extraer blah.zip
de una imagen con otros ¿Pensamientos?
fuente
create
comando agregado / eliminado (no está presente en 1.01)docker create
se introdujo en Dockerdocker cp $id:path > local-tar-file
funcionó perfectamente.Desafortunadamente, no parece haber una forma de copiar archivos directamente desde las imágenes de Docker. Primero debe crear un contenedor y luego copiar el archivo del contenedor.
Sin embargo, si su imagen contiene un
cat
comando (y lo hará en muchos casos), puede hacerlo con un solo comando:Si su imagen no contiene
cat
, simplemente cree un contenedor y use eldocker cp
comando como se sugiere en la respuesta de Igor.fuente
Una opción mucho más rápida es copiar el archivo del contenedor en ejecución a un volumen montado:
** VS **
fuente
cat a >b
vscp a b
tienen tiempos similares a los que se muestran aquí. Además, si la ruta de origen y la ruta de destino residen en diferentes sistemas de archivos, ambos ejemplos conducirán a una copia completa byte por byte.El comentario de los padres ya mostró cómo usar cat . También puede usar alquitrán de manera similar:
fuente
docker run --rm --entrypoint tar _image_ cC _img_directory_ . | tar xvC _host_directory_
quería suministrar una solución de una línea
editar: el contenedor ni siquiera tiene que ejecutarse en esta solución
fuente
Otra respuesta (corta) a este problema:
fuente
Estoy usando boot2docker en MacOS. Puedo asegurarles que los scripts basados en "docker cp" son portátiles. Debido a que cualquier comando se transmite dentro de boot2docker, pero luego la secuencia binaria se transmite de nuevo al cliente de línea de comandos de Docker que se ejecuta en su Mac. Por lo tanto, las operaciones de escritura desde el cliente de la ventana acoplable se ejecutan dentro del servidor y se vuelven a escribir en la instancia del cliente en ejecución.
Estoy compartiendo un script de respaldo para los volúmenes de la ventana acoplable con cualquier contenedor de la ventana acoplable que proporcione y mis scripts de respaldo se prueban tanto en Linux como en MacOS con boot2docker. Las copias de seguridad se pueden intercambiar fácilmente entre plataformas. Básicamente, estoy ejecutando el siguiente comando dentro de mi script:
Ya moví archivos entre el contenedor de Linux y mi contenedor de mac sin ningún ajuste en el script de copia de seguridad o restauración. Si esto es lo que desea, encontrará el script completo y un tutorial aquí: blacklabelops / jenkins
fuente
Puede vincular una ruta local en el host a una ruta en el contenedor, y luego
cp
los archivos deseados a esa ruta al final de su script.Entonces no es necesario copiar después.
fuente