Estoy tratando de crear una solución de respaldo y restauración para los contenedores Docker con los que trabajamos.
Tengo la imagen base de Docker que he creado, ubuntu:base
y no quiero tener que reconstruirla cada vez con un archivo Docker para agregarle archivos.
Quiero crear un script que se ejecute desde la máquina host y cree un nuevo contenedor con la ubuntu:base
imagen de Docker y luego copie los archivos en ese contenedor.
¿Cómo puedo copiar archivos del host al contenedor?
docker
docker-container
usuario3001829
fuente
fuente
Respuestas:
El
cp
comando se puede usar para copiar archivos.Se puede copiar un archivo específico AL contenedor como:
Se puede copiar un archivo específico del contenedor como:
Para enfatizar,
mycontainer
es una ID de contenedor , no una ID de imagen .Se
src
pueden copiar varios archivos contenidos en la carpeta en latarget
carpeta usando:Referencia: documentos de Docker CLI para
cp
En las versiones de Docker anteriores a la 1.8 solo era posible copiar archivos de un contenedor al host. No desde el host a un contenedor.
fuente
COPY
prefiere sobreADD
cuando corresponde.docker cp
para copiar del contenedor al host funciona bien, pero cuando se usa para copiar archivos del host al contenedor, no tiene efecto ... ¿alguien sabe por qué? versión docker: Docker versión 1.10.3, compilación cb079f6-Obtener el nombre del contenedor o el ID del contenedor corto:
Obtener la identificación del contenedor completo:
Copiar archivo:
EJEMPLO:
o
fuente
aufs
sino adevicemapper
. La forma más fácil de verificar la ruta de montaje de los contenedores (mientras se está ejecutando) es ejecutar el comandomount
./var/lib/docker/aufs/diff/<id>/
/var/lib
para mí.find / -name docker
tampoco fue útil.La forma más limpia es montar un directorio de host en el contenedor al iniciar el contenedor:
fuente
docker run -d -p -v /host/path:/mnt --name container_name image_name
docker cp
sea una operación unidireccional!La siguiente es una forma bastante fea de hacerlo, pero funciona.
fuente
docker commit `docker ps -l -q` ubuntu-with-file
. De lo contrario, el cambio se perderá (use el nombre que desee en lugar deubuntu-with-file
)docker exec
función para trabajar con el contenedor en ejecución:docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
docker exec -i ...
lugar de-it
, porque no hay TTY cuando se conecta desde un archivo.tar -c -v -f - /path/to/host/directory | docker exec -i <container-name> bash -c 'tar -x -v --strip-components 1 -f - -C /path/to/container/directory'
Si necesita hacer esto en un contenedor en ejecución, puede usar docker exec (agregado en 1.3).
Primero, encuentre el nombre o ID del contenedor:
En el ejemplo anterior, podemos usar
b9b7400ddd8f
oelated_hodgkin
.Si desea copiar todo en
/tmp/somefiles
el host/var/www
en el contenedor:Luego podemos ejecutar
/bin/bash
en el contenedor y verificar que funcionó:fuente
Cree un nuevo dockerfile y use la imagen existente como base.
Luego construya el contenedor:
fuente
La solución se da a continuación,
Desde el caparazón de Docker,
Del anfitrión
El archivo se copiará directamente en la ubicación donde se encuentra el contenedor en el sistema de archivos.
fuente
Por lo general, hay tres tipos:
De un contenedor al host
Del host a un contenedor
De un contenedor a un contenedor combina 1 y 2
fuente
Otra solución para copiar archivos en un contenedor en ejecución es usar tar:
Copia el archivo
foo.sh
en/tmp
el contenedor.Editar: Eliminar el redundante
-f
, gracias al comentario de Maarten .fuente
-f -
embargo, es un poco redundante, el comportamiento predeterminado es escribir en stdout de todos modos.Para copiar un archivo del host al contenedor en ejecución
Basado en la respuesta de Erik y los comentarios de Mikl y z0r.
fuente
Con Docker 1.8,
docker cp
puede copiar archivos del host al contenedor. Consulte la publicación del blog de Docker Anunciando Docker 1.8: Confianza de contenido, Caja de herramientas y actualizaciones de registro y orquestación .fuente
docker cp foo.txt mycontainer:/foo.txt
Esta es una respuesta directa a la pregunta 'Copiar archivos del host al contenedor Docker' planteada en esta pregunta en el título.
Tratar
docker cp
. Es la forma más fácil de hacerlo y funciona incluso en mi Mac. Uso:Esto copiará el archivo
some-file.txt
en el directorio/root
de su máquina host en el contenedor Docker nombradosome-docker-container
en el directorio/root
. Está muy cerca de la sintaxis de copia segura. Y como se muestra en la publicación anterior, puede usarlo al revés. Es decir, también copia los archivos del contenedor al host.Y antes de que descargues esta publicación, ingresa
docker cp --help
. Leer la documentación puede ser muy útil, a veces ...Si no le gusta de esa manera y desea volúmenes de datos en su contenedor ya creado y en ejecución, la recreación es su única opción hoy. Consulte también ¿Cómo puedo agregar un volumen a un contenedor Docker existente? .
fuente
Intenté la mayoría de las soluciones (votadas) aquí, pero en Docker 17.09 (en 2018) ya no hay una carpeta / var / lib / docker / aufs.
Así de simple
docker cp
resolvió esta tarea.¿Cómo obtener container_name?
Hay una
NAMES
seccion. No uses aIMAGE
.fuente
Para copiar archivos / carpetas entre un contenedor y el sistema de archivos local, escriba el comando:
Por ejemplo,
Para obtener la identificación del contianer, escriba el comando dado:
El contenido anterior está tomado de docker.com .
fuente
Suponiendo que el contenedor ya se está ejecutando, escriba el comando dado:
Para compartir archivos usando el directorio compartido, ejecute el contenedor escribiendo el comando dado:
Nota: Pueden surgir problemas con los permisos ya que los usuarios del contenedor no son los mismos que los usuarios del host.
fuente
docker exec -it <container_id> bash -c 'cat > /path/to/container/file' < /path/to/host/file/
cat
no se terminará una vez que salga. Si es importante para usted (si está copiando scripts de bash, bash se negará a ejecutarlos), debe ejecutarlsof | grep yourfilename
y eliminar elcat
proceso que contiene dicho archivo.kill $(lsof | grep /path/to/file | sed ...)
. Estaré agradecido por tu ayudakill $(docker top CONTAINERNAME | sed -n '/cat$/p' | sed 's/^root[^0-9]\+\([0-9]\+\).*$/\1/')
Este es el comando para copiar datos de Docker a Host:
A continuación se muestra el comando para copiar datos del host a la ventana acoplable:
fuente
En un entorno acoplable, todos los contenedores se encuentran en el directorio:
/var/lib/docker/aufs/required-docker-id/
Para copiar el directorio / archivo fuente a cualquier parte del contenedor, escriba el comando dado:
sudo cp -r mydir/ /var/lib/docker/aufs/mnt/required-docker-id/mnt/
fuente
tar
ydocker cp
son una buena combinación para copiar todo en un directorio.Crear un contenedor de volumen de datos
Para preservar la jerarquía de directorios
Revisa tu trabajo
fuente
Si el host es CentOS o Fedora, hay un proxy que NO está en
/var/lib/docker/aufs
, pero está debajo de/proc
:Este cmd copiará todo el contenido del
data
directorio al/
contenedor con la identificación "containerid".fuente
/proc
). También extienda la ruta para colocar el archivo en otro lugar, no solo en la raíz.En caso de que no esté claro para alguien como yo lo que significa
mycontainer
en la respuesta @ h3nrik, en realidad es la identificación del contenedor. Para copiar un archivoWarpSquare.mp4
en/app/example_scenes/1440p60
desde un contenedor ventana acoplable salido a la carpeta actual utilicé esta.donde
docker ps -q -l
muestra el id del contenedor de la última instancia salida. En caso de que no sea un contenedor salido, puede obtenerlodocker container ls
odocker ps
fuente
docker ps -a
odocker container ls -a
.Muchos de los que encuentran esta pregunta pueden tener el problema de copiar archivos en una imagen de Docker mientras se está creando (lo hice).
En ese caso, puede usar el
COPY
comandoDockerfile
que usa para crear la imagen.Ver la documentación .
fuente
Puede rastrear la dirección IP de su máquina local utilizando
Luego ingrese a su contenedor Docker y escriba
En cualquier caso, si no tiene un cliente y servidor SSH instalado, simplemente instálelo usando:
fuente
Este es un en línea para copiar un solo archivo mientras se ejecuta un contenedor tomcat.
Esto copiará el archivo war al directorio webapps y hará que su aplicación se ejecute en poco tiempo.
fuente
Sintaxis de Contenedor:
En el archivo acoplable
fuente
La mejor manera de copiar archivos al contenedor que encontré es montar un directorio en el host usando la
-v
opción del comando docker run.fuente
Hay buenas respuestas, pero muy específicas. Descubrí que
docker ps
es una buena manera de obtener la identificación del contenedor que le interesa. Luego, hagapara ver dónde está montado el volumen. Eso es
para mí, pero podría ser una ruta diferente dependiendo del sistema operativo y la configuración. Ahora simplemente copie los archivos a esa ruta.
Usar
-v
no siempre es práctico.fuente
Acabo de comenzar a usar Docker para compilar VLC, esto es lo que puede hacer para copiar archivos de un lado a otro de los contenedores:
¡Busque un archivo familiar en ese txt y tendrá la carpeta, cd como root y listo! copia todo lo que quieras
Puede haber un camino con "fusionado", creo que quieres el que tiene "diff".
Además, si sale del contenedor y desea volver a donde lo dejó:
Supongo que es útil cuando no nombraste nada con un comando como
Claro que el método hacker pero ¿y qué?
fuente
Por ejemplo, quiero copiar mi archivo xxxx / download / jenkins a tomcat
Empiezo a obtener la identificación del contenedor Tomcat
fuente
Mi metodo favorito
Contenedores
file.txt
o
fuente
En mi opinión, no tiene que copiar archivos dentro de la imagen, pero puede usar GIT o SVN para sus archivos y luego configurar un volumen sincronizado con una carpeta local. Use un script mientras ejecuta el contenedor que puede verificar si los datos ya existen en la carpeta local, si no los copia del repositorio GIT. Eso hace que tu imagen sea muy ligera.
fuente