{"id":2197,"date":"2025-10-01T18:00:00","date_gmt":"2025-10-01T18:00:00","guid":{"rendered":"https:\/\/mugnos-it.com\/?p=2197"},"modified":"2025-10-01T12:56:44","modified_gmt":"2025-10-01T12:56:44","slug":"seu-dockerfile-esta-te-sabotando-dicas-para-criar-um-dockerfile-de-qualidade","status":"publish","type":"post","link":"https:\/\/mugnos-it.com\/pt\/seu-dockerfile-esta-te-sabotando-dicas-para-criar-um-dockerfile-de-qualidade\/","title":{"rendered":"Seu Dockerfile est\u00e1 te sabotando? Dicas para criar um Dockerfile de qualidade!"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"2197\" class=\"elementor elementor-2197\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-37f9ac4f e-flex e-con-boxed e-con e-parent\" data-id=\"37f9ac4f\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-52024547 elementor-widget elementor-widget-text-editor\" data-id=\"52024547\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Fala Galera, beleza ?<\/p>\n\n\n\n<p>Docker j\u00e1 \u00e9 uma tecnologia consolidada no mercado. E, por isso mesmo, muita gente trata o <code>Dockerfile<\/code> como algo simples, resolvido, quase autom\u00e1tico. Mas \u00e9 justamente a\u00ed que muitos projetos falham.<\/p>\n\n\n\n<p>A forma como voc\u00ea escreve seu <code>Dockerfile<\/code> pode comprometer:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>o tempo de build<\/li>\n\n\n\n<li>o tempo de subida dos containers<\/li>\n\n\n\n<li>a seguran\u00e7a da aplica\u00e7\u00e3o<\/li>\n\n\n\n<li>a rastreabilidade de erros<\/li>\n\n\n\n<li>o custo com armazenamento<\/li>\n\n\n\n<li>e at\u00e9 a efici\u00eancia dos seus testes e deploys<\/li>\n<\/ul>\n\n\n\n<p>No newsletter de hoje, vamos passar por algumas pr\u00e1ticas fundamentais para garantir um <code>Dockerfile<\/code> limpo, leve e confi\u00e1vel.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Boas pr\u00e1ticas para criar um Dockerfile de qualidade<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Use imagens base enxutas<\/h3>\n\n\n\n<p>Evite imagens gen\u00e9ricas como <code>ubuntu:latest<\/code>. Prefira vers\u00f5es <strong>slim<\/strong>, <strong>distroless<\/strong> ou espec\u00edficas da linguagem. Al\u00e9m disso, tem algumas imagens \u201calpine\u201d que s\u00e3o \u00f3timas.<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"686\" height=\"88\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-1.png\" alt=\"\" class=\"wp-image-2198\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-1.png 686w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-1-300x38.png 300w\" sizes=\"(max-width: 686px) 100vw, 686px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. Seja expl\u00edcito com vers\u00f5es<\/h3>\n\n\n\n<p>Nunca confie em <code>latest<\/code>. Isso pode comprometer a previsibilidade do build. J\u00e1 vi de ficarem com Latest at\u00e9 come\u00e7ar a dar problema pois o runtime teve uma atualiza\u00e7\u00e3o!<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"710\" height=\"140\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-2.png\" alt=\"\" class=\"wp-image-2199\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-2.png 710w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-2-300x59.png 300w\" sizes=\"(max-width: 710px) 100vw, 710px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Organize o build para aproveitar cache<\/h3>\n\n\n\n<p>No Docker, cada instru\u00e7\u00e3o cria uma camada que pode ser reaproveitada em builds futuros.<\/p>\n\n\n\n<p>Se voc\u00ea copiar todo o c\u00f3digo antes de instalar as depend\u00eancias, qualquer pequena altera\u00e7\u00e3o (at\u00e9 em um coment\u00e1rio) vai invalidar o cache e for\u00e7ar a reinstala\u00e7\u00e3o de tudo.<\/p>\n\n\n\n<p>A forma correta \u00e9 <strong>copiar primeiro apenas o arquivo de depend\u00eancias<\/strong> (<code>requirements.txt<\/code>, <code>package.json<\/code>, etc.), instalar os pacotes e s\u00f3 depois copiar o restante do c\u00f3digo. Assim, o cache das depend\u00eancias s\u00f3 \u00e9 refeito quando realmente houver mudan\u00e7as nelas \u2014 acelerando bastante o build.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"709\" height=\"230\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-3.png\" alt=\"\" class=\"wp-image-2200\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-3.png 709w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-3-300x97.png 300w\" sizes=\"(max-width: 709px) 100vw, 709px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Use <code>.dockerignore<\/code><\/h3>\n\n\n\n<p>Durante o build, o Docker envia todo o conte\u00fado do diret\u00f3rio para o <em>contexto de build<\/em>.<\/p>\n\n\n\n<p>Se voc\u00ea n\u00e3o filtrar nada, isso inclui pastas e arquivos que n\u00e3o t\u00eam nenhuma utilidade na imagem, como <code>.git<\/code>, <code>node_modules<\/code>, logs ou at\u00e9 arquivos tempor\u00e1rios.<\/p>\n\n\n\n<p>Um <code>.dockerignore<\/code> bem configurado:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>acelera o build<\/strong>, porque menos dados s\u00e3o enviados;<\/li>\n\n\n\n<li><strong>reduz o tamanho da imagem<\/strong>, j\u00e1 que nada desnecess\u00e1rio vai parar l\u00e1 dentro;<\/li>\n\n\n\n<li><strong>evita vazamentos de informa\u00e7\u00f5es sens\u00edveis<\/strong>, como chaves, configs locais ou hist\u00f3ricos de c\u00f3digo.<\/li>\n<\/ul>\n\n\n\n<p>Exemplo simples de <code>.dockerignore<\/code>:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"696\" height=\"137\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-4.png\" alt=\"\" class=\"wp-image-2201\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-4.png 696w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-4-300x59.png 300w\" sizes=\"(max-width: 696px) 100vw, 696px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. Agrupe comandos em um \u00fanico <code>RUN<\/code><\/h3>\n\n\n\n<p>Cada instru\u00e7\u00e3o <code>RUN<\/code> no Docker cria uma nova camada na imagem.<\/p>\n\n\n\n<p>Se voc\u00ea espalhar v\u00e1rias instru\u00e7\u00f5es (<code>RUN apt-get update<\/code>, depois outro <code>RUN apt-get install<\/code>, e assim por diante), vai acabar com <strong>muitas camadas extras<\/strong>, aumentando o tamanho final da imagem e dificultando sua manuten\u00e7\u00e3o.<\/p>\n\n\n\n<p>A pr\u00e1tica recomendada \u00e9 <strong>agrupar os comandos relacionados em uma \u00fanica instru\u00e7\u00e3o<\/strong> e sempre limpar caches tempor\u00e1rios ao final, garantindo imagens mais leves e otimizadas:<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"508\" height=\"155\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-5.png\" alt=\"\" class=\"wp-image-2202\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-5.png 508w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-5-300x92.png 300w\" sizes=\"(max-width: 508px) 100vw, 508px\" \/><\/figure>\n\n\n\n<p>Assim voc\u00ea:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mant\u00e9m menos camadas (famosas layers) no build;<\/li>\n\n\n\n<li>reduz o tamanho da imagem;<\/li>\n\n\n\n<li>evita ac\u00famulo de arquivos tempor\u00e1rios que nunca seriam usados no container em execu\u00e7\u00e3o.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. Defina <code>ENTRYPOINT<\/code> e <code>CMD<\/code> corretamente<\/h3>\n\n\n\n<p>No Docker, <code>ENTRYPOINT<\/code> e <code>CMD<\/code> t\u00eam pap\u00e9is diferentes, mas complementares:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>ENTRYPOINT<\/code><\/strong> define o comando principal, que sempre ser\u00e1 executado.<\/li>\n\n\n\n<li><strong><code>CMD<\/code><\/strong> define par\u00e2metros ou valores padr\u00e3o, que podem ser sobrescritos na hora de rodar o container.<\/li>\n<\/ul>\n\n\n\n<p>Usando os dois juntos, voc\u00ea cria imagens mais <strong>flex\u00edveis e previs\u00edveis<\/strong>.<\/p>\n\n\n\n<p>Exemplo:<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"669\" height=\"125\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-6.png\" alt=\"\" class=\"wp-image-2203\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-6.png 669w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-6-300x56.png 300w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><\/figure>\n\n\n\n<p>Nesse caso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O container sempre vai iniciar o interpretador <strong>Python<\/strong> (<code>ENTRYPOINT<\/code>).<\/li>\n\n\n\n<li>Por padr\u00e3o, ele executa o <code>app.py<\/code> (<code>CMD<\/code>).<\/li>\n\n\n\n<li>Se precisar, voc\u00ea pode sobrescrever apenas o argumento ao rodar o container:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"688\" height=\"102\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-7.png\" alt=\"\" class=\"wp-image-2204\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-7.png 688w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-7-300x44.png 300w\" sizes=\"(max-width: 688px) 100vw, 688px\" \/><\/figure>\n\n\n\n<p>Assim, o <code>ENTRYPOINT<\/code> garante consist\u00eancia e o <code>CMD<\/code> d\u00e1 flexibilidade.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. Configure <code>HEALTHCHECK<\/code><\/h3>\n\n\n\n<p>O <code>HEALTHCHECK<\/code> garante que o Docker saiba se o container realmente est\u00e1 funcionando.<\/p>\n\n\n\n<p>Sem ele, o container pode estar \u201crodando\u201d, mas indispon\u00edvel.<\/p>\n\n\n\n<p>Exemplo:<br><br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"632\" height=\"104\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-8.png\" alt=\"\" class=\"wp-image-2205\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-8.png 632w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-8-300x49.png 300w\" sizes=\"(max-width: 632px) 100vw, 632px\" \/><\/figure>\n\n\n\n<p>Isso permite que orquestradores (como Docker Swarm ou Kubernetes) reiniciem ou removam containers com falhas automaticamente.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. Nunca exponha vari\u00e1veis sens\u00edveis<\/h3>\n\n\n\n<p>Nunca coloque <strong>secrets, tokens ou credenciais<\/strong> direto no <code>Dockerfile<\/code> ou em instru\u00e7\u00f5es como <code>ENV<\/code>.<\/p>\n\n\n\n<p>Essas informa\u00e7\u00f5es ficam registradas nas camadas da imagem e podem ser recuperadas facilmente. (Lembra do 12-factor app ?!)<\/p>\n\n\n\n<p>O ideal \u00e9:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Usar <strong>vari\u00e1veis de ambiente<\/strong> definidas na hora do deploy;<\/li>\n\n\n\n<li>Ou adotar ferramentas pr\u00f3prias para gest\u00e3o de segredos, como <strong>Vault, AWS Secrets Manager, SSM, GCP Secret Manager<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Assim, voc\u00ea mant\u00e9m a imagem segura e evita expor dados cr\u00edticos.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. <strong>Use <em>multi-stage builds \u2190 USEEE MESMO!<\/em><\/strong><\/h3>\n\n\n\n<p>O <em>multi-stage build<\/em> permite separar o processo de <strong>build<\/strong> do de <strong>execu\u00e7\u00e3o<\/strong>, deixando a imagem final mais leve e segura.<\/p>\n\n\n\n<p>Exemplo:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"279\" src=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-9.png\" alt=\"\" class=\"wp-image-2206\" srcset=\"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-9.png 680w, https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/docker-9-300x123.png 300w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/><\/figure>\n\n\n\n<p>\ud83d\udc49 Note que no exemplo acima usamos uma imagem <strong>maior<\/strong> (<code>golang:1.20<\/code>) para compilar a aplica\u00e7\u00e3o e depois copiamos apenas o bin\u00e1rio final para uma imagem <strong>menor<\/strong> (<code>golang:1.20-alpine<\/code>).<\/p>\n\n\n\n<p>Benef\u00edcios:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A imagem final cont\u00e9m apenas o necess\u00e1rio para rodar.<\/li>\n\n\n\n<li>Bibliotecas e ferramentas de compila\u00e7\u00e3o n\u00e3o v\u00e3o para produ\u00e7\u00e3o.<\/li>\n\n\n\n<li>Reduz drasticamente o tamanho da imagem e a superf\u00edcie de ataque.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>O <code>Dockerfile<\/code> pode parecer s\u00f3 um detalhe t\u00e9cnico, mas ele define muito da <strong>performance, seguran\u00e7a e previsibilidade<\/strong> do seu sistema.<\/p>\n\n\n\n<p>Um arquivo bem escrito evita custos desnecess\u00e1rios, acelera seus ciclos de entrega e aumenta a confian\u00e7a nos ambientes de produ\u00e7\u00e3o.<\/p>\n\n\n\n<p>No fim das contas, n\u00e3o \u00e9 s\u00f3 sobre \u201crodar um container\u201d. \u00c9 sobre criar uma base s\u00f3lida para que sua aplica\u00e7\u00e3o seja realmente moderna, resiliente e de alta qualidade.<\/p>\n\n\n\n<p>\ud83d\udc49 Caso queira se aprofundar em temas como <strong>Site Reliability Engineering<\/strong>, <strong>12-Factor App<\/strong> e muitas outras pr\u00e1ticas de arquitetura moderna, vale conhecer a <strong>Comunidade de Arquitetura Descomplicada (CaD)<\/strong>.<\/p>\n\n\n\n<p><a href=\"https:\/\/mugnos-it.com\/pt\/cad\/\">Saiba mais aqui<\/a> \ud83d\ude80<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-090e9a4 e-flex e-con-boxed e-con e-parent\" data-id=\"090e9a4\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Fala Galera, beleza ? Docker j\u00e1 \u00e9 uma tecnologia consolidada no mercado. E, por isso mesmo, muita gente trata o Dockerfile como algo simples, resolvido, quase autom\u00e1tico. Mas \u00e9 justamente a\u00ed que muitos projetos falham. A forma como voc\u00ea escreve seu Dockerfile pode comprometer: No newsletter de hoje, vamos passar por algumas pr\u00e1ticas fundamentais para [&hellip;]<\/p>","protected":false},"author":3,"featured_media":2207,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2197","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/mugnos-it.com\/wp-content\/uploads\/2025\/10\/image-68.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/comments?post=2197"}],"version-history":[{"count":4,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2197\/revisions"}],"predecessor-version":[{"id":2211,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/posts\/2197\/revisions\/2211"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media\/2207"}],"wp:attachment":[{"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/media?parent=2197"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/categories?post=2197"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mugnos-it.com\/pt\/wp-json\/wp\/v2\/tags?post=2197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}