A cópia do Dockerfile mantém a estrutura do subdiretório

256

Estou tentando copiar vários arquivos e pastas para uma imagem de janela de encaixe criada no meu host local.

Os arquivos são assim:

folder1
    file1
    file2
folder2
    file1
    file2

Estou tentando fazer a cópia assim:

COPY files/* /files/

No entanto, todos os arquivos são colocados em / files / existe uma maneira no Docker de manter a estrutura do subdiretório e de copiar os arquivos em seus diretórios?

user1220022
fonte
1
você poderia esclarecer qual resultado obteve e qual resultado espera?
21315 Thomasleveil

Respostas:

413

Remova a estrela de COPY, com este Dockerfile:

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

A estrutura está lá:

$ 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
fonte
64
Mas e se eu precisar de apenas alguns arquivos COPY files/*1 /files/?
Pavel Agarkov
1
Isso também substituirá os arquivos existentes nesse diretório?
chander
1
@chander, sim, os arquivos existentes serão substituídos
ISanych
4
É importante observar que o segredo aqui é que existe UM diretório de origem e UM diretório de destino especificado. Qualquer outra combinação copia o conteúdo do (s) diretório (s) de origem no diretório de destino.
Marcin
Não consegui ver a saída RUN ls -la /files/*diretamente da saída do console de docker build. Então, em vez disso, fui diretamente ao contêiner para fazer lsdiretamente no host, comdocker exec -it <container name> /bin/bash
somenickname
31

Como alternativa, você pode usar um "." em vez de *, como todos os arquivos do diretório de trabalho, inclua as pastas e subpastas:

FROM ubuntu
COPY . /
RUN ls -la /
Sparkz0629
fonte
1
isso incluirá arquivos e diretórios ocultos, como o diretório '.git'?
Bruno Negrão Zica
7
@ BrunoNegrãoZica, você pode usar o arquivo .dockerignore para especificar quais arquivos / pastas você gostaria de ser ignorado durante a operação de cópia. É tarde, mas espero que isso seria útil para alguém
Hellaren
21

Para mesclar um diretório local em um diretório dentro de uma imagem, faça isso. Ele não excluirá os arquivos já presentes na imagem. Ele adicionará apenas arquivos presentes localmente, substituindo os arquivos na imagem se já existir um arquivo com o mesmo nome.

COPY ./files/. /files/
Cameron Hudson
fonte