tag - imagenes docker




Copiando archivos del contenedor Docker al host (10)

Como una solución más general, hay un plugin de CloudBees para que Jenkins pueda construir dentro de un contenedor Docker . Puede seleccionar una imagen para usar de un registro de Docker o definir un Dockerfile para construir y usar.

Montará el espacio de trabajo en el contenedor como un volumen (con el usuario adecuado), lo configurará como su directorio de trabajo, y ejecutará los comandos que solicite (dentro del contenedor). También puede usar el complemento de flujo de trabajo de la ventana acoplable (si prefiere el código sobre la interfaz de usuario) para hacer esto, con el comando image.inside () {}.

Básicamente todo esto, horneado en su servidor CI / CD y algo más.

Estoy pensando en usar Docker para construir mis dependencias en un servidor de integración continua (CI), de modo que no tenga que instalar todos los tiempos de ejecución y bibliotecas en los propios agentes. Para lograr esto, necesitaría copiar los artefactos de compilación que se construyen dentro del contenedor de nuevo en el host.

¿Es eso posible?


Crea una ruta donde quieras copiar el archivo y luego usa:

docker run -d -v hostpath:dockerimag

Estoy publicando esto para cualquiera que esté usando Docker para Mac. Esto es lo que funcionó para mí:

 $ mkdir mybackup # local directory on Mac

 $ docker run --rm --volumes-from <containerid> \
    -v `pwd`/mybackup:/backup \  
    busybox \                   
    cp /data/mydata.txt /backup 

Tenga en cuenta que cuando monte usando -v ese directorio de backup se crea automáticamente.

Espero que esto le sea útil a alguien algún día. :)


La mayoría de las respuestas no indican que el contenedor debe ejecutarse antes de que funcione docker cp :

docker build -t IMAGE_TAG .
docker run -d IMAGE_TAG
CONTAINER_ID=$(docker ps -alq)
# If you do not know the exact file name, you'll need to run "ls"
# FILE=$(docker exec CONTAINER_ID sh -c "ls /path/*.zip")
docker cp $CONTAINER_ID:/path/to/file .
docker stop $CONTAINER_ID

Monte un volumen, copie los artefactos, ajuste la identificación del propietario y la identificación del grupo:

mkdir artifacts
docker run -i --rm -v ${PWD}/artifacts:/mnt/artifacts centos:6 /bin/bash << COMMANDS
ls -la > /mnt/artifacts/ls.txt
echo Changing owner from \$(id -u):\$(id -g) to $(id -u):$(id -u)
chown -R $(id -u):$(id -u) /mnt/artifacts
COMMANDS

No es necesario utilizar la docker run

Puedes hacerlo con docker create

Desde la documentación El comando docker create crea una capa de contenedor grabable sobre la imagen especificada y la prepara para ejecutar el comando especificado. La ID del contenedor se imprime a continuación. Esto es similar a la ejecución de la ventana acoplable -d, excepto que el contenedor nunca se inicia.

Entonces tu puedes hacer

docker create -ti --name dummy IMAGE_NAME bash
docker cp dummy:/path/to/file /dest/to/file
docker rm -fv dummy

Aquí, nunca empiezas el contenedor. Eso me pareció beneficioso.


Si no tiene un contenedor en ejecución, solo una imagen, y suponiendo que desea copiar solo un archivo de texto, podría hacer algo como esto:

docker run the-image cat path/to/container/file.txt > path/to/host/file.txt

Si solo desea extraer un archivo de una imagen (en lugar de un contenedor en ejecución), puede hacer esto:

docker run --rm <image> cat <source> > <local_dest>

Esto abrirá el contenedor, escribirá el nuevo archivo y luego eliminará el contenedor. Un inconveniente, sin embargo, es que los permisos de archivo y la fecha de modificación no se conservarán.


tldr;

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown $(id -u):$(id -g) my-artifact.tar.xz
cp -a my-artifact.tar.xz /host-volume
EOF

Más...

docker run con un volumen de host, chown el artefacto, cp el artefacto al volumen de host:

$ docker build -t my-image - <<EOF
> FROM busybox
> WORKDIR /workdir
> RUN touch foo.txt bar.txt qux.txt
> EOF
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM busybox
 ---> 00f017a8c2a6
Step 2/3 : WORKDIR /workdir
 ---> Using cache
 ---> 36151d97f2c9
Step 3/3 : RUN touch foo.txt bar.txt qux.txt
 ---> Running in a657ed4f5cab
 ---> 4dd197569e44
Removing intermediate container a657ed4f5cab
Successfully built 4dd197569e44

$ docker run --rm -iv${PWD}:/host-volume my-image sh -s <<EOF
chown -v $(id -u):$(id -g) *.txt
cp -va *.txt /host-volume
EOF
changed ownership of '/host-volume/bar.txt' to 10335:11111
changed ownership of '/host-volume/qux.txt' to 10335:11111
changed ownership of '/host-volume/foo.txt' to 10335:11111
'bar.txt' -> '/host-volume/bar.txt'
'foo.txt' -> '/host-volume/foo.txt'
'qux.txt' -> '/host-volume/qux.txt'

$ ls -n
total 0
-rw-r--r-- 1 10335 11111 0 May  7 18:22 bar.txt
-rw-r--r-- 1 10335 11111 0 May  7 18:22 foo.txt
-rw-r--r-- 1 10335 11111 0 May  7 18:22 qux.txt

Este truco funciona porque la invocación chown dentro del heredoc toma los valores $(id -u):$(id -g) desde fuera del contenedor en ejecución; es decir, el host docker.

Los beneficios sobre docker cp son:

  • no tienes que docker run --name tu contenedor antes
  • no tienes que docker container rm después de







file-copying