Estou procurando empacotar muito código-fonte local e aberto em um contêiner docker que será distribuído para máquinas host para construção e execução. A intenção do contêiner final é ser executado no estilo de linha de comando e gerar o resultado ex. ( docker run cmdcontainer args
). O problema que tenho é que a fonte distribuída precisa ser direcionada e compilada no host específico em que será executada uma vez e isso leva horas para ser concluído. No entanto, uma vez compilado, o comando é executado muito rápido.
Então, estou me perguntando se existe um padrão docker conhecido para esse tipo de fluxo de trabalho:
Distribuir Docker Container com arquivos de origem -> Execute o contêiner para gerar um novo contêiner com binários compilados -> execuções subsequentes executam o contêiner compilado
Como isso é basicamente colocar um novo contêiner em cima do antigo, parece que isso deveria ser possível, mas sou um novato em docker.
Responder1
Para cada host ser único, a melhor solução que posso encontrar envolve o uso de um volume para persistência. Você precisaria do seguinte fluxo de trabalho em seu ponto de entrada:
- Verifique a versão do seu código compilado no volume
- Se a versão for incompatível, exclua o conteúdo do volume
- Se a versão não estiver definida ou for incompatível, execute sua compilação
- Escreva o novo número da versão nesse volume
- Execute seu aplicativo a partir da versão compilada no volume
Isso exige que a construção da sua imagem incorpore um número de versão, por exemplo, um hash git. Você pode fazer isso com um argumento de construção:
docker build --build-arg GIT_REV=$(git rev-parse --short HEAD) ...
E então seu Dockerfile incluiria algo como:
ARG GIT_REV
ENV GIT_REV=${GIT_REV}
Observe que qualquer usuário executando sem um volume ainda verá cada execução realizar a compilação.