Copia de Dockerfile mantener estructura de subdirectorio


257

Estoy tratando de copiar una serie de archivos y carpetas a una construcción de imagen de acoplador desde mi host local.

Los archivos son así:

folder1
    file1
    file2
folder2
    file1
    file2

Estoy tratando de hacer la copia así:

COPY files/* /files/

Sin embargo, todos los archivos se colocan en / files / ¿hay alguna manera en Docker para mantener la estructura del subdirectorio y copiar los archivos en sus directorios?


1
¿podría aclarar qué resultado obtuvo y qué resultado espera?
Thomasleveil

Respuestas:


413

Elimine la estrella de COPY, con este Dockerfile:

FROM ubuntu
COPY files/ /files/
RUN ls -la /files/*

La estructura está ahí:

$ docker build .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu
 ---> d0955f21bf24
Step 1 : COPY files/ /files/
 ---> 5cc4ae8708a6
Removing intermediate container c6f7f7ec8ccf
Step 2 : RUN ls -la /files/*
 ---> Running in 08ab9a1e042f
/files/folder1:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2

/files/folder2:
total 8
drwxr-xr-x 2 root root 4096 May 13 16:04 .
drwxr-xr-x 4 root root 4096 May 13 16:05 ..
-rw-r--r-- 1 root root    0 May 13 16:04 file1
-rw-r--r-- 1 root root    0 May 13 16:04 file2
 ---> 03ff0a5d0e4b
Removing intermediate container 08ab9a1e042f
Successfully built 03ff0a5d0e4b

64
Pero, ¿qué pasa si solo necesito algunos archivos COPY files/*1 /files/?
Pavel Agarkov

1
¿Esto también sobrescribirá los archivos existentes en ese directorio?
Chander

1
@chander, sí, los archivos existentes se sobrescribirán
ISanych

44
Es importante tener en cuenta que la salsa secreta aquí es que hay UN directorio de origen y UN directorio de destino especificado. Cualquier otra combinación copia el contenido de los directorios de origen en el directorio de destino.
Marcin

No pude ver la salida de RUN ls -la /files/*directamente desde la salida de la consola de docker build. Así que en su lugar fui ssh al contenedor directamente para hacerlo lsdirectamente en el host, condocker exec -it <container name> /bin/bash
somenickname

32

Alternativamente, puede usar un "." en lugar de *, ya que esto tomará todos los archivos en el directorio de trabajo, incluya las carpetas y subcarpetas:

FROM ubuntu
COPY . /
RUN ls -la /

1
¿eso incluirá archivos ocultos y directorios como el directorio '.git'?
Bruno Negrão Zica

77
@ BrunoNegrãoZica, puede usar el archivo .dockerignore para especificar qué archivos / carpetas desea que se ignoren durante la operación de copia. Es tarde, pero espero que sea útil para alguien más
Hellaren

21

Para fusionar un directorio local en un directorio dentro de una imagen, haga esto. No eliminará los archivos ya presentes en la imagen. Solo agregará archivos que estén presentes localmente, sobrescribiendo los archivos en la imagen si ya existe un archivo con el mismo nombre.

COPY ./files/. /files/
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.