Padrão Docker para contêineres com um comando inicial longo

Padrão Docker para contêineres com um comando inicial longo

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:

  1. Verifique a versão do seu código compilado no volume
  2. Se a versão for incompatível, exclua o conteúdo do volume
  3. Se a versão não estiver definida ou for incompatível, execute sua compilação
  4. Escreva o novo número da versão nesse volume
  5. 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.

informação relacionada