Dockerignore: ignore tudo, exceto um arquivo e o Dockerfile

92

Portanto, a intenção principal era encaixar um aplicativo de jarra de gordura e colocá-lo no Elasticbeanstalk. O problema está no contexto. É um pouco estúpido adicionar tanto contexto ao docker se tudo que eu preciso é realmente um único arquivo jar.

Tenho brincado com o arquivo .dockerignore, mas estou perdido. Tentei usar a negação gitignore, mas não funcionou.

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

Também existe aquela coisa com regex, mas parece que não há suporte para regex complicado.

^((?!Dockerfile).)*$

Também tentei pesquisar em stackoverflow, e estes dois são tudo que encontrei:

Esta pergunta pode ser semelhante à segunda, mas acho que é um pouco diferente, pois aqui, quero apenas incluir um único arquivo no contexto.

Qualquer ajuda será apreciada.

Rowanto
fonte
Ponto de exclamação para pastas funciona para mim!
Ivan Aracki

Respostas:

135

Se você precisar ignorar tudo, exceto alguns diretórios ou arquivos e também ignorar alguns arquivos desnecessários dentro desses diretórios permitidos, você pode usar o seguinte .dockerignorearquivo:

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db
Mauricio Sánchez
fonte
8
De acordo com a documentação do Docker , deve ser suficiente colocar apenas *na primeira linha (em vez de **). Citação: "você pode querer especificar quais arquivos incluir no contexto, em vez de quais excluir. Para conseguir isso, especifique *como o primeiro padrão, seguido por um ou mais !padrões de exceção".
Johnny Thunderman
32

Da referência do dockerfile :

Além das regras filepath.Match de Go, o Docker também oferece suporte a uma string curinga especial ** que corresponde a qualquer número de diretórios (incluindo zero). Por exemplo, ** / *. Go excluirá todos os arquivos que terminam com .go encontrados em todos os diretórios, incluindo a raiz do contexto de construção.

Portanto, uma linha contendo simplesmente ** irá ignorar tudo no mesmo diretório que o Dockerfile.

Como esperado, a exclamação pode então ser usada para fazer referência a quaisquer arquivos que você deseja enviar para o daemon do docker.

Abraão
fonte
3
É extremamente importante que **vá para o início do arquivo, caso contrário, as exclusões serão ignoradas. O Docker usa a última regra que corresponde à regra "final", portanto, se **for a última, corresponderá a tudo.
tedivm
3
Portanto, adicione **na primeira linha e !foona próxima linha se foofor o único arquivo que deseja incluir.
Saca
9

Isso pode parecer estranho, mas se tudo que você precisa é um único arquivo jar, você pode criar uma pasta "docker" em seu sistema de compilação que contém seu Dockerfile. Ao executar suas compilações, faça com que os scripts de compilação copiem o arquivo jar único em "docker", em seguida, executem a compilação da imagem docker (de dentro da pasta "docker") e envie para o registro do docker quando terminar.

Jay Atkinson
fonte
2
Olá, não parece nada estranho. Achei que fosse uma prática geral, mas estava procurando uma maneira de fazer isso com o .dockerignore, se possível. Além disso, eu realmente não gosto de mvn xml :)
Rowanto
Você pode combinar as duas abordagens colocando o dockerfile em um subdiretório e usando .dockerignore. De acordo com os documentos, é bom fazer isso de qualquer maneira
Jonathan Lee
Documentação do Docker : na maioria dos casos, é melhor começar com um diretório vazio como contexto e manter o Dockerfile nesse diretório. Adicione apenas os arquivos necessários para construir o Dockerfile. Aviso: Não use seu diretório raiz, /, como o PATH, pois isso faz com que o build transfira todo o conteúdo do seu disco rígido para o daemon do Docker.
Jonathan Lee