DOCKER SERIES: LAB … (Build ARG) X (ENV Variable)

Bem-vindo 2023!!! 🤩🎉🥳 Saúde, paz e muitas alegrias é o que desejo a todos vocês, queridos leitores. Festividades e comemorações à parte, retomemos ao que interessa …

Avançando no dia-a-dia, precisamos ter em mente o aprimoramento do projeto bem como o seu “fatídico” (num bom sentido) compartilhamento. Por exemplo, com outros setores da empresa ou integrantes da mesma equipe. É pensando nisso que devemos sempre documentar quais foram os parâmetros usados para o funcionamento de determinada aplicação/serviço. No caso do DOCKER, podemos fazê-lo de duas formas: através de variáveis de ambiente (ENV) ou argumentos de construção (ARG).

Na prática, é bem fácil confundi-los pois ambos são instruções inerentes ao DOCKERFILE. Além disso, eles cumprem o mesmo objetivo, que é a aplicação de diferentes configurações para um único artefato. Então, para distingui-los temos que nos voltar ao seu alcance, chamado por alguns de escopo. O primeiro refere-se ao tempo de execução, ou seja, valores/chaves que podem ser modificados tanto à nível de construção da imagem quanto à nível de execução do container. Traduzindo, seria como testar a mesma imagem em configurações distintas. Já o segundo mexe apenas com o pré-estágio de uma imagem. Em outras palavras, somente durante o processo de construção da imagem.

Mais algumas diferenças importantes entre os dois, a seguir:

  • Parâmetros ARG ficam indisponíveis após o término do processo.
  • Containers não acessam valores ARG.
  • Variáveis ARG podem incluir configurações de alto nível, como versão do SO ou biblioteca específica.
  • ARGs podem definir valores padrão no dockerfile, que serão passíveis de mudança somente durante a criação de uma BUILD.
  • Elementos que são considerados “parâmetros ENV” normalmente trazem chaves de API, URLs de banco, segredos e senhas, etc.
  • ENVs também apresentam valores padrão no dockerfile que podem ser sobrescritos mais tarde por linha de comando ou outros tipos de arquivos.

E para os que ainda estão confusos, encontrei uma figura que ajuda a esclarecer um pouco melhor:

Figura 01. https://refine.ams3.cdn.digitaloceanspaces.com/blog/2022-09-28-docker-build-args/docker-environment-build-args.png

Documentando portas : EXPOSE

Visando facilitar o trabalho entre quem publica a imagem e a pessoa que de fato usa o container, foi estabelecida uma instrução de nome EXPOSE para automaticamente expor uma porta de rede quando executado o comando DOCKER RUN. O intuito é evitar que o operador humano se perca na hora de rodar uma aplicação X por conta própria. Sendo assim, aperfeiçoando o nosso arquivo do último post, podemos incrementá-lo escrevendo:

FROM node:14
WORKDIR /app-node
EXPOSE 3000
COPY . .
RUN npm install
ENTRYPOINT npm start

E agora para efeitos de teste e validação, basta retornar ao terminal e executar dois comandos: primeiro build e depois run. Detalhe, sem o parâmetro de portas, como -p ou -P. Apenas o -d, de detached mode

docker build -t vicrlda/app-node:2.0 .
docker run -d vicrlda/app-node:2.0
docker ps
Figura 02. app-node:2.0

Reparem que deste ponto em diante, todos saberão qual porta utilizar, tornando obsoleto qualquer tipo de mapeamento posterior ou até mesmo manual.

Parametrizando o NodeJS : process.env.PORT

Sabemos a partir das aulas de programação WEB que o html formata uma página, o css estiliza a mesma, e o javascript executa ações. Então, caso queiramos deixá-la mais “interativa e amigável”, por assim dizer, precisamos criar um argumento de construção (ARG) para receber determinado valor informado pelo usuário. Para isso, abra e edite o arquivo chamado index.js

const express = require('express')
let app = express();

app.use(express.static("."));

app.get("/", (req,res)=>{
    res.sendFile(__dirname + '/index.html')
})

app.listen(process.env.PORT, ()=>{
    console.log("Server is listening on port 3000")
})

Em seguida, modifique o dockerfile para:

FROM node:14
WORKDIR /app-node
ARG PORT_BUILD=6000
ENV PORT=$PORT_BUILD
EXPOSE $PORT_BUILD
COPY . .
RUN npm install
ENTRYPOINT npm start

Novamente construa e rode outra vez:

docker build -t vicrlda/app-node:3.0 .
docker run -d vicrlda/app-node:3.0
docker ps
Figura 03. app-node:3.0

FAVORITE, SIGA, CURTA!!!

Referências:

https://docs.docker.com/engine/reference/builder/

https://refine.dev/blog/docker-build-args-and-env-vars/

https://phoenixnap.com/kb/docker-environment-variables

Deixe uma resposta

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.