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 .zipproducido por sbt disten '../ target / `, pero creo que esta pregunta también se aplica a jar, binarios, etc.
docker cptrabaja en contenedores, no en imágenes; ¿Necesito iniciar un contenedor solo para sacar un archivo? En un script, intenté ejecutarlo /bin/bashen 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 .tararchivo después de ejecutarlo docker save $IMAGENAMEsolo 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 boot2dockeren 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.zipde una imagen con otros ¿Pensamientos?
fuente

createcomando agregado / eliminado (no está presente en 1.01)docker createse introdujo en Dockerdocker cp $id:path > local-tar-filefuncionó 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
catcomando (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 cpcomando 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 >bvscp a btienen 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
cplos archivos deseados a esa ruta al final de su script.Entonces no es necesario copiar después.
fuente