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:

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

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

FAVORITE, SIGA, CURTA!!!
Referências:
https://docs.docker.com/engine/reference/builder/