Tenho um projeto Python que estou desenvolvendo dentro de um devcontainer. A árvore do código-fonte se parece com isso:
---.devcontainer
|--- .devcontainer.json
|--- Dockerfile
|--- requirements.txt
---src
|--- file1.py
|--- file2.py
O problema é que ele deve ser lançado em um "contêiner de produção", o que envolve seu próprio Dockerfile e scripts de empacotamento.
Minhas perguntas são:
- Onde devo colocar o Dockerfile do "contêiner de produção" e os scripts de empacotamento?
- Onde devo criar o container de produção? Devo executar
docker build
dentro do container dev? - Quando devo executar
docker build
para construir o contêiner de produção?
O Dockerfile deve ser nomeado exatamente
Dockerfile
, sem extensão, e estar na raiz do diretório do seu projeto (ao lado depyproject.toml
). Este é o local padrãodocker build
que espera encontrá-lo.Não há um local canônico similar para scripts de build. É comum o bastante mantê-los na raiz do projeto também, ou ter um diretório
build
orbin
oudocker
que os contenha.Parece que o VSCode não monta automaticamente o socket Docker em um contêiner dev e, portanto, você não conseguiria executar
docker
comandos por padrão. Você teria que certificar-se de montar o socket e instalar o Docker CLI. Provavelmente é mais fácil executardocker build
diretamente no sistema host.(Enquanto estiver lá, considere usar o Python pré-instalado no seu host MacOS ou Linux para desenvolvimento comum, ou ferramentas sem contêiner, como Hatch ou Pyenv, que podem manter instalações alternativas do Python.)
Você precisa executar
docker build
sempre que precisar de uma cópia atualizada da imagem. Eu geralmente recomendaria isso para testes de integração local. Você frequentemente terá um sistema de construção automatizado que construirá a imagem para você quando você fizer commit no controle de origem, então você normalmente não precisará construir-enviar-implantar manualmente uma imagem. Da mesma forma, eu usaria suas ferramentas de desenvolvedor para executar testes unitários comuns (pytest
,hatch test
como um wrapper) sem envolver contêineres.