Docker: vários arquivos de encaixe no projeto

214

Como você organiza os Dockerfiles pertencentes a um projeto quando você tem um Dockerfile para o banco de dados, um para o servidor de aplicativos e assim por diante? Você cria algum tipo de hierarquia na fonte? Um grande projeto empresarial não pode consistir em apenas um Dockerfile?

LuckyLuke
fonte
15
você pode querer mudar a resposta aceita
pomber
3
Deve haver uma opção para "superar" e mover automaticamente um atributo obsoleto "Aceito" para uma resposta mais apropriada. O critério de elegibilidade para essa mudança poderia ser 1) uma grande diferença nos votos de, digamos, 10: 1 E 2) que o autor da pergunta não fez login por, um ano ou mais (parece que @LuckyLuke se aposentou do SO 4 anos há ...)
mirekphd 22/11/19

Respostas:

6

Nota do autor

Esta resposta está desatualizada. O figo não existe mais e foi substituído pelo Docker compor . As respostas aceitas não podem ser excluídas ....

O Docker Compose suporta a construção da hierarquia do projeto. Portanto, agora é fácil oferecer suporte a um Dockerfile em cada subdiretório.

├── docker-compose.yml
├── project1
│   └── Dockerfile
└── project2
    └── Dockerfile

Resposta original

Acabei de criar um diretório que contém um Dockerfile para cada componente. Exemplo:

Ao criar os contêineres, forneça o nome do diretório e o Docker selecionará o arquivo Docker correto.

Mark O'Connor
fonte
3
@DuncanJones Porque você não pode excluir uma resposta aceita ... Tentei :-)
Mark O'Connor
285

Nas versões mais recentes (> = 1.8.0) da janela de encaixe , você pode fazer isso

docker build -f Dockerfile.db .
docker build -f Dockerfile.web .

Uma grande salva.

EDIT: atualizar versões por comentário de raksja

EDIT: comentário de @vsevolod: é possível obter destaque de sintaxe no código VS, fornecendo arquivos .Dockerfile extension (em vez de nome), por exemplo, Prod.Dockerfile, Test.Dockerfile etc.

Shuo
fonte
2
qual versão mais recente?
raksja
4
Verifiquei apenas, github.com/docker/docker/wiki , assim que seu> Docker 1.8.0
raksja
3
Certifique-se de que isso funcione, mas meu IDE não fará nenhum realce de sintaxe, porque não reconhece o nome do arquivo :(
Alexander Mills
3
@AlexanderMills meu IDE WebStorm nem sequer permite Dockerfile.webcomo configuração de execução. Então, eu criei um problema: youtrack.jetbrains.com/issue/WEB-28185
steampowered
5
Como você especifica qual Dockerfile deve ser usado para cada 'serviço' definido em um docker-compose.ymlarquivo, por exemplo?
JoeTidee
127

Use docker-composee múltiplo Dockerfileem diretórios separados

Não renomeie seuDockerfile para Dockerfile.dbou Dockerfile.web, ele pode não ser suportado pelo seu IDE e você perderá o destaque da sintaxe.

Como Kingsley Uchnor disse , você pode ter vários Dockerfile, um por diretório, que representam algo que você deseja criar.

Eu gosto de ter uma dockerpasta que contém cada aplicativo e sua configuração. Aqui está um exemplo de hierarquia de pastas do projeto para um aplicativo Web que possui um banco de dados.

docker-compose.yml
docker
├── web
│   └── Dockerfile
└── db
    └── Dockerfile

docker-compose.yml exemplo:

version: '3'
services:
  web:
    # will build ./docker/web/Dockerfile
    build: ./docker/web
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  db:
    # will build ./docker/db/Dockerfile
    build: ./docker/db
    ports:
      - "3306:3306"
  redis:
    # will use docker hub's redis prebuilt image from here:
    # https://hub.docker.com/_/redis/
    image: "redis:alpine"

docker-compose Exemplo de uso da linha de comando:

# The following command will create and start all containers in the background
# using docker-compose.yml from current directory
docker-compose up -d

# get help
docker-compose --help

Caso você precise de arquivos de pastas anteriores ao criar seu Dockerfile

Você ainda pode usar a solução acima e colocá-la Dockerfileem um diretório como docker/web/Dockerfile, tudo o que você precisa é definir a compilação contextda docker-compose.ymlseguinte maneira:

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
     - "5000:5000"
    volumes:
     - .:/code

Dessa forma, você poderá ter coisas como esta:

config-on-root.ini
docker-compose.yml
docker
└── web
    ├── Dockerfile
    └── some-other-config.ini

e ./docker/web/Dockerfileassim:

FROM alpine:latest

COPY config-on-root.ini /
COPY docker/web/some-other-config.ini /

Aqui estão alguns comandos rápidos do tldr docker-compose . Certifique-se de consultar a documentação oficial para obter mais detalhes.

GabLeRoux
fonte
1
E se você precisar copiar um arquivo do gerenciador de pacotes para instalar o deps no tempo de construção (fi COPY ../package.json /app/package.json)? Esse arquivo geralmente estará no nível da raiz e a janela de encaixe proibiu o acesso ao pai. Que abordagem você seguirá?
Nass600
1
Eu bati essa limitação e também para essa exceção, eu construir o webprojeto de . (in docker-compose.yml: build: .). Dessa forma, webtem acesso aos arquivos raiz ao criar. Eu já vi essa pergunta relacionada: stackoverflow.com/questions/24537340/… e podemos construir a partir do diretório pai ao usar a dockerlinha de comando e esta resposta mostra como fazer isso com o docker-compose: stackoverflow.com/a/45353241/ 1092815
GabLeRoux
1
Esse é um problema com o seu IDE, não com a janela de encaixe. @Shuo tem a resposta correta.
BentOnCoding 01/03
1
A segunda resposta tem 1 ano de idade, mas não está diretamente na documentação do Docker. -fopção é boa, mas eu prefiro usardocker-compose com subpastas. Eu acho que ambas as respostas são válidas. A maioria das pessoas pode preferir manter o Dockerfilenome padrão para suportar a maioria dos IDEs fora da caixa. Não estou invalidando a primeira resposta, estou apenas fornecendo uma alternativa. Eu simplesmente não gosto que meu IDE pense que meu Dockerfile é um phparquivo quando eu uso Dockerfile.php, mas sim, ele funciona. Eu já vi alguns exemplos na documentação do docker; Dockerfile.build, Dockerfile.debug, Etc.
GabLeRoux
3
Nomear como example.Dockerfilemantém o destaque da sintaxe e os ícones no VSCode.
vmassuchetto
8

No Intellij, alterei simplesmente o nome dos arquivos do docker para * .Dockerfile e associei o tipo de arquivo * .Dockerfile à sintaxe do docker.

KaziMurtaza
fonte
1
Tentei isso e recebo um bom ícone do Docker.
Drumbeg
3

Adicione uma camada de abstração, por exemplo, um arquivo YAML como neste projeto https://github.com/larytet/dockerfile-generator que se parece com

centos7:
    base: centos:centos7
    packager: rpm
    install:
      - $build_essential_centos 
      - rpm-build
    run:
      - $get_release
    env:
      - $environment_vars

Um script / make Python curto pode gerar todos os Dockerfiles a partir do arquivo de configuração.

Larytet
fonte
1

Ao trabalhar em um projeto que requer o uso de vários arquivos docker, basta criar cada arquivo docker em um diretório separado. Por exemplo,

app / db /

Cada um dos diretórios acima conterá seu arquivo docker. Quando um aplicativo está sendo criado, o docker pesquisará todos os diretórios e criará todos os arquivos do docker.

Kingsley Uchnor
fonte