La copia de Dockerfile mantiene la estructura del subdirectorio

Resuelto user1220022 asked hace 9 años • 6 respuestas

Estoy intentando copiar varios archivos y carpetas a una compilación de imagen de Docker desde mi host local.

Los archivos son así:

folder1/
    file1
    file2
folder2/
    file1
    file2

Estoy intentando hacer la copia así:

COPY files/* /files/

Sin embargo, todos los archivos de folder1/y folder2/se colocan /files/directamente, sin sus carpetas:

files/
    file1
    file2

¿Hay alguna forma en Docker de mantener la estructura de subdirectorios y de copiar los archivos en sus directorios? Como esto:

files/
    folder1/
        file1
        file2
    folder2/
        file1
        file2
user1220022 avatar May 13 '15 20:05 user1220022
Aceptado

Elimina 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
ISanych avatar May 13 '2015 16:05 ISanych

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

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629 avatar Nov 29 '2018 12:11 Sparkz0629

Para fusionar un directorio local en un directorio dentro de una imagen, haga esto. No eliminará archivos que ya estén 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 ./local-path/. /image-path/
Cameron Hudson avatar Jul 08 '2019 19:07 Cameron Hudson

No pude conseguir que ninguna de estas respuestas funcionara para mí. Tuve que agregar un punto para el directorio actual, para que el archivo acoplable en funcionamiento se vea así:

FROM ubuntu 
WORKDIR /usr/local
COPY files/ ./files/

Además, usar RUN lsto verificar no funcionó para mí y lograr que funcionara parecía realmente complicado, una forma mucho más fácil de verificar lo que hay en el archivo acoplable es ejecutar un shell interactivo y verificar lo que hay allí, usando docker run -it <tagname> sh.

Nathan Hughes avatar Aug 18 '2022 17:08 Nathan Hughes

Si desea copiar un directorio de origen completamente con la misma estructura de directorios, no utilice un asterisco (*). Escriba el comando COPY en Dockerfile como se muestra a continuación.

COPY . destinatio-directory/ 
Dileep Jayasundara avatar Oct 29 '2020 03:10 Dileep Jayasundara