Como copiar vários arquivos em uma camada usando um Dockerfile?

245

O seguinte Dockerfilecontém quatro COPYcamadas:

COPY README.md ./
COPY package.json ./
COPY gulpfile.js ./
COPY __BUILD_NUMBER ./

Como copiar esses arquivos usando uma camada? O seguinte foi tentado:

COPY [
    "__BUILD_NUMBER ./",
    "README.md ./",
    "gulpfile ./",
    "another_file ./",
]
kazhuravlev
fonte

Respostas:

427
COPY README.md package.json gulpfile.js __BUILD_NUMBER ./

ou

COPY ["__BUILD_NUMBER", "README.md", "gulpfile", "another_file", "./"]

Você também pode usar caracteres curinga na especificação do arquivo de origem. Veja os documentos para um pouco mais de detalhes .

Diretórios são especiais! Se você escrever

COPY dir1 dir2 ./

que realmente funciona como

COPY dir1/* dir2/* ./

Se você deseja copiar vários diretórios (não o conteúdo) em um diretório de destino em um único comando, será necessário configurar o contexto de construção para que seus diretórios de origem estejam sob um pai comum e depois COPYnesse pai.

Nathaniel Waisbrot
fonte
53
Observe que, se as fontes são diretórios, isso copia o conteúdo do diretório , não os próprios diretórios.
Claudiu
7
Observe também que o diretório de destino é o mesmo. Se você cria vários arquivos diferentes com destinos diferentes, considere construir um sistema de arquivos de sobreposição (como um chroot), transformá-lo em um tararquivo morto e adicioná-lo ao ADD.
tu restabelece Monica-dor duh
4
@ Claudiu Como copiar as próprias pastas?
K0pernikus
5
@ k0pernikus você pode dizer COPY myDir1 ./MyDir1/
Manuel Manhart
@ manuel-manhart Existe alguém que sabe se podemos parametrizar a lista de arquivos usando um Parâmetro de Construção? github.com/moby/moby/issues/38532 ?
Marcello de Sales
52
COPY <all> <the> <things> <last-arg-is-destination>

Mas aqui está um trecho importante dos documentos:

Se você tiver várias etapas do Dockerfile que usam arquivos diferentes do seu contexto, copie-os individualmente, em vez de todos de uma vez. Isso garante que o cache de construção de cada etapa seja invalidado apenas (forçando a execução da etapa) se os arquivos especificamente necessários forem alterados.

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#add-or-copy

swapsCAPS
fonte
você sabe se podemos parametrizar "todas as coisas" ??? Usando parâmetros de construção? github.com/moby/moby/issues/38532 ???
Marcello de Sales
@ MarcellodeSales não sabe por que você precisaria disso. Por que você não cria uma imagem base sem esses arquivos e as imagens filhas têm a instrução de cópia nelas - se elas precisam definir o caminho de qualquer maneira, isso não faz muita diferença. Ou você pode simplesmente deixar de fora as imagens completamente e montá-las no contêiner - aí você tem os arquivos .env para configurá-los.
Manuel Manhart 12/01/19
Além disso, você sempre pode copiar um caminho existente de qualquer maneira, já que o sistema de arquivos é em camadas, ele sobrepõe / oculta o conteúdo pré-existente.
Manuel Manhart 12/01/19
@ManuelManhart, estou construindo uma imagem dinâmica parametrizada com ONBUILD COPY ... Como parte de uma plataforma, estou ocultando a complexidade do que precisa ser feito na imagem; é por isso que preciso que os valores sejam fornecidos como um parâmetro.
Marcello de Sales
@ MarcellodeSales Eu não acho que isso seja suportado agora / ainda. Mas você pode usar argumentos de construção para encapsulá-lo, consulte stackoverflow.com/questions/43654656/…
Manuel Manhart
7

simples

COPY README.md  package.json gulpfile.js __BUILD_NUMBER ./

do doc

Se vários recursos forem especificados, diretamente ou devido ao uso de um curinga, ele deverá ser um diretório e terminar com uma barra /.

Edwin Ikechukwu Okonkwo
fonte
6

Vale ressaltar que você também pode criar um .dockerignorearquivo para excluir os arquivos que não deseja copiar:

https://docs.docker.com/engine/reference/builder/#dockerignore-file

Antes de a CLI do docker enviar o contexto para o daemon do docker, ele procura um arquivo chamado .dockerignore no diretório raiz do contexto. Se esse arquivo existir, a CLI modificará o contexto para excluir arquivos e diretórios que correspondem aos padrões nele. Isso ajuda a evitar o envio desnecessário de arquivos e diretórios grandes ou confidenciais para o daemon e a possibilidade de adicioná-los às imagens usando ADD ou COPY.

Aaron
fonte