[{"data":1,"prerenderedAt":117},["ShallowReactive",2],{"blog-how-to-dockerize-a-full-stack-application":3},{"title":4,"description":7,"image":10,"category":11,"featured":12,"isPublished":13,"publishDate":14,"author":15,"links":16,"projects":23,"mainLanguage":24,"viewCount":25,"value":26,"content":27,"tableOfContents":30},{"en":5,"pl":6},"Application containerization","Konteneryzacja aplikacji",{"en":8,"pl":9},"Learn Docker and containerization from scratch: base images, layer caching, .dockerignore, multi-stage builds, and security best practices for Node and Python apps.","Naucz się Dockera i konteneryzacji od podstaw: obrazy bazowe, cache warstw, .dockerignore, multi-stage builds i najlepsze praktyki dla aplikacji Node i Python.","https://files.jtuta.cloud/public/portfolio/blogs/UBcoyvk03NolioRvDqpJF9UzmKDqw1.png","devops",false,true,"2025-07-06T22:51:14.572Z",null,[17,18,19,20,21,22],"https://docs.docker.com/","https://docker-curriculum.com/","https://docs.docker.com/develop/develop-images/dockerfile_best-practices/","https://www.docker.com/products/docker-desktop/","https://docs.docker.com/compose/","https://hub.docker.com/",[],"pl",1,"how-to-dockerize-a-full-stack-application",{"en":28,"pl":29},"\u003Ch2 id=\"introduction-to-containerization-and-docker-from-idea-to-practice\" tabindex=\"-1\">Introduction to Containerization and Docker: From Idea to Practice\u003C/h2>\n\u003Cp>Getting started with Docker and containerization might seem difficult and overwhelming at first. In this article, I will introduce you to the basic concepts related to containerization and show examples of containers for Full Stack applications along with best practices.\u003C/p>\n\u003Ch3 id=\"what-is-containerization\" tabindex=\"-1\">What is Containerization?\u003C/h3>\n\u003Cp>Imagine your application as a complex machine that requires not only the code itself but also specific libraries, dependencies, and system settings to function. Traditionally, running it on another computer (e.g., a production server) often led to &quot;it works on my machine&quot; problems.\u003C/p>\n\u003Cp>\u003Cstrong>Containerization\u003C/strong> is the technology that solves this problem. It involves &quot;packaging&quot; the application together with all its dependencies (libraries, configuration files, runtime environment) into one portable package called a \u003Cstrong>container\u003C/strong>. Such a container is fully isolated from the rest of the system and other containers. It always behaves the same way – regardless of whether you run it on your laptop, a cloud server, or a computer on the other side of the world.\u003C/p>\n\u003Ch3 id=\"containers-vs-virtual-machines-vm\" tabindex=\"-1\">Containers vs. Virtual Machines \u003Cem>(VM)\u003C/em>\u003C/h3>\n\u003Cp>Containers are often compared to virtual machines, but the differences between them are crucial. A virtual machine emulates an entire operating system, including the kernel, which requires significant resources (RAM, CPU, disk space). Containers share the host operating system's kernel and only isolate the application's runtime environment.\u003C/p>\n\u003Cp>Because of this, containers are:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Lighter and Faster\u003C/strong> – they start in seconds, not minutes.\u003C/li>\n\u003Cli>\u003Cstrong>More Efficient\u003C/strong> – they use significantly fewer system resources.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"what-is-docker\" tabindex=\"-1\">What is Docker?\u003C/h3>\n\u003Cp>\u003Cstrong>Docker\u003C/strong> is the most popular platform for creating, running, and managing containers. It was Docker that popularized the idea of containerization and provided easy-to-use tools that enable its use in everyday development work.\u003C/p>\n\u003Cp>Basic Docker components:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Dockerfile\u003C/strong> – a simple text file containing instructions on how to build a container image. It's the recipe for your application.\u003C/li>\n\u003Cli>\u003Cstrong>Image\u003C/strong> – a read-only template created from a Dockerfile. It contains everything needed to run the application.\u003C/li>\n\u003Cli>\u003Cstrong>Container\u003C/strong> – a running instance of an image. It's the &quot;live&quot; version of your application.\u003C/li>\n\u003Cli>\u003Cstrong>Docker Engine\u003C/strong> – a background engine responsible for building and running containers.\u003C/li>\n\u003C/ul>\n\u003Cp>The simplest tool to start working with Docker is \u003Cstrong>Docker Desktop\u003C/strong>\n(\u003Ca href=\"https://www.docker.com/products/docker-desktop\" target=\"_blank\" rel=\"noopener noreferrer\">docker.com/products/docker-desktop\u003C/a>).\u003C/p>\n\u003Ch3 id=\"why-containerize-applications\" tabindex=\"-1\">Why Containerize Applications?\u003C/h3>\n\u003Cp>Docker and containerization offer a number of benefits that make them an integral part of modern programming today:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Environment Consistency\u003C/strong> – no more &quot;it only works on my machine&quot; problem. The application runs identically in every environment.\u003C/li>\n\u003Cli>\u003Cstrong>Portability\u003C/strong> – a container can be run on any system with Docker.\u003C/li>\n\u003Cli>\u003Cstrong>Fast Deployment\u003C/strong> – new versions of the application can be deployed and run in seconds.\u003C/li>\n\u003Cli>\u003Cstrong>Isolation and Security\u003C/strong> – applications run in isolated environments, so the failure of one does not affect others.\u003C/li>\n\u003Cli>\u003Cstrong>Performance\u003C/strong> – containers are lightweight, allowing more of them to run on the same server, which reduces costs.\u003C/li>\n\u003Cli>\u003Cstrong>Scalability\u003C/strong> – more traffic? Simply run more containers.\u003C/li>\n\u003Cli>\u003Cstrong>Integration with DevOps and CI/CD\u003C/strong> – Docker works seamlessly with automation, testing, and deployment pipelines.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"dockerfile-creating-an-image\" tabindex=\"-1\">\u003Cem>Dockerfile\u003C/em>: Creating an Image\u003C/h2>\n\u003Cp>A well-written \u003Cem>Dockerfile\u003C/em> is key to creating a lightweight, secure, and efficient image. Here are some guidelines for creating a better image:\u003C/p>\n\u003Ch3 id=\"choosing-the-right-base-image\" tabindex=\"-1\">Choosing the Right Base Image\u003C/h3>\n\u003Cp>The \u003Cstrong>base image\u003C/strong> is the foundation on which you build your container. It contains a ready-made operating system with pre-installed tools, serving as a starting point for your application. The choice of base image significantly impacts the security, size, and performance of the final container.\u003C/p>\n\u003Cp>You can check, compare, and choose images on \u003Ca href=\"https://hub.docker.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Hub\u003C/a>.\u003C/p>\n\u003Cp>\u003Cstrong>Types of base images:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Official images\u003C/strong> (e.g., \u003Ccode>node:18\u003C/code>, \u003Ccode>python:3.11\u003C/code>) – maintained by Docker Hub, regularly updated.\u003C/li>\n\u003Cli>\u003Cstrong>\u003Cem>Alpine\u003C/em> images\u003C/strong> (e.g., \u003Ccode>node:18-alpine\u003C/code>) – minimalistic, based on \u003Cem>Alpine Linux\u003C/em>, very lightweight (~5MB).\u003C/li>\n\u003Cli>\u003Cstrong>\u003Cem>Distroless\u003C/em> images\u003C/strong> – contain only the essential libraries to run the application, without a system shell.\u003C/li>\n\u003C/ul>\n\u003Cp>A general rule for choosing base images is to use the smallest possible images, unless the lack of required libraries causes application errors.\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Good choice - official, lightweight Alpine image\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Dobry wybór - oficjalny, lekki obraz Alpine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18-alpine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Size: ~110MB / Rozmiar: ~110MB\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Avoid - too heavy image with full Ubuntu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Unikaj - zbyt ciężki obraz z pełnym Ubuntu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> ubuntu:latest\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Size: ~800MB+ after installing Node.js / Rozmiar: ~800MB+ po zainstalowaniu Node.js\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># For Go applications - distroless for maximum security\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Dla aplikacji Go - distroless dla maksymalnego bezpieczeństwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> gcr.io/distroless/static-debian11\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Size: ~2MB, no system shell / Rozmiar: ~2MB, brak powłoki systemowej\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"layer-minimization\" tabindex=\"-1\">Layer Minimization\u003C/h3>\n\u003Cp>\u003Cstrong>What are layers in Docker?\u003C/strong> Each instruction in a Dockerfile \u003Cem>(RUN, COPY, ADD)\u003C/em> creates a new layer in the image. Layers are read-only files that are stacked one on top of the other. More layers mean a larger image size and longer build time.\u003C/p>\n\u003Cp>\u003Cstrong>How layers work:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Each layer only stores changes relative to the previous layer.\u003C/li>\n\u003Cli>Layers are shared between images (saves space).\u003C/li>\n\u003Cli>Modifying one layer requires rebuilding all subsequent layers.\u003C/li>\n\u003C/ul>\n\u003Cp>Layers can be combined using \u003Ccode>&amp;&amp;\u003C/code>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Better approach - single layer\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Lepsze podejście - jedna warstwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get update &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    apt-get install -y \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        curl \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        wget \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        git &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    apt-get clean &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    rm -rf /var/lib/apt/lists/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Result: 1 layer / Rezultat: 1 warstwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Avoid - multiple layers\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Unikaj - wiele warstw\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get update\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get install -y curl\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get install -y wget\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get install -y git\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get clean\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> rm -rf /var/lib/apt/lists/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Result: 6 layers (larger image) / Rezultat: 6 warstw (większy obraz)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"utilizing-layer-cache\" tabindex=\"-1\">Utilizing Layer \u003Cem>Cache\u003C/em>\u003C/h3>\n\u003Cp>\u003Cstrong>How does layer \u003Cem>cache\u003C/em> work?\u003C/strong> Docker utilizes a \u003Cem>cache\u003C/em> during image builds. When an instruction in the \u003Cem>Dockerfile\u003C/em> hasn't changed since the last \u003Cem>build\u003C/em>, Docker uses the previously built layer instead of building it again. The cache is checked based on:\u003C/p>\n\u003Cul>\n\u003Cli>Instruction content.\u003C/li>\n\u003Cli>Files copied into the container.\u003C/li>\n\u003Cli>Build context.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>\u003Cem>Cache-friendly\u003C/em> strategy:\u003C/strong> Place instructions that rarely change at the beginning of the file. Application code, which changes most often, should be placed at the end.\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18-alpine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># These files change rarely - good for cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Te pliki zmieniają się rzadko - dobre dla cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache will be used if package.json hasn't changed\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache zostanie użyty jeśli package.json się nie zmienił\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Application code changes frequently - at the end\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Kod aplikacji zmienia się często - na końcu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm run build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache will be invalidated on every code change\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache zostanie unieważniony przy każdej zmianie kodu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>Example of \u003Cem>cache\u003C/em> invalidation (Avoid!)\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># If you change app.js, cache will be invalidated from this point\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Jeśli zmienisz app.js, cache zostanie unieważniony od tego momentu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> app.js ./               # Cache miss - file changed / Cache miss - plik się zmienił\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install             # Will be executed again / Zostanie wykonane ponownie\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package.json ./    # Will be executed again / Zostanie wykonane ponownie\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"creating-dockerignore\" tabindex=\"-1\">Creating \u003Cem>.dockerignore\u003C/em>\u003C/h3>\n\u003Cp>\u003Cstrong>What is \u003Cem>.dockerignore\u003C/em>?\u003C/strong> The \u003Cem>.dockerignore\u003C/em> file works similarly to \u003Cem>.gitignore\u003C/em> – it defines files and directories that should be excluded from the Docker build context. The build context is all files and directories transferred to the \u003Cem>Docker daemon\u003C/em> during image building.\u003C/p>\n\u003Cp>\u003Cstrong>Why is it important:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Reduces the size of the build context.\u003C/li>\n\u003Cli>Speeds up data transfer to the \u003Cem>Docker daemon\u003C/em>.\u003C/li>\n\u003Cli>Prevents accidental copying of sensitive data.\u003C/li>\n\u003Cli>Improves security.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Example \u003Cem>.dockerignore\u003C/em> file\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">node_modules/        # Dependencies will be installed in container / Zależności będą zainstalowane w kontenerze\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.git/                # Git history not needed in container / Historia Git nie jest potrzebna w kontenerze\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.DS_Store            # macOS system files / Pliki systemowe macOS\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.env                 # Environment variables (may contain passwords) / Zmienne środowiskowe (mogą zawierać hasła)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">README.md            # Documentation / Dokumentacja\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.dockerignore        # The .dockerignore file itself / Sam plik .dockerignore\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">Dockerfile           # The Dockerfile itself / Plik Dockerfile\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.log                # Log files / Pliki logów\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">coverage/            # Test reports / Raporty testów\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.nyc_output/         # Coverage data / Dane coverage\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"security\" tabindex=\"-1\">Security\u003C/h3>\n\u003Cp>\u003Cstrong>Why not run as \u003Cem>root\u003C/em>?\u003C/strong> By default, Docker containers run as \u003Cem>root\u003C/em>, meaning they have full access to all system functionalities and files. This is a security risk because:\u003C/p>\n\u003Cul>\n\u003Cli>The application has full privileges within the container.\u003C/li>\n\u003Cli>In case of a container escape, the attacker has \u003Cem>root\u003C/em> privileges.\u003C/li>\n\u003Cli>It violates the principle of least privilege.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Creating a dedicated user\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Create group and user\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Tworzenie grupy i użytkownika\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> addgroup -g 1001 -S nodejs &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    adduser -S nextjs -u 1001 -G nodejs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set file ownership\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Ustawienie właściciela plików\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --chown=nextjs:nodejs . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Switch to non-privileged user\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Przełączenie na użytkownika bez uprawnień\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">USER\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> nextjs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"size-optimization\" tabindex=\"-1\">Size Optimization\u003C/h3>\n\u003Cp>\u003Cstrong>What are \u003Cem>multi-stage builds\u003C/em>?\u003C/strong> \u003Cem>Multi-stage builds\u003C/em> allow using multiple base images in a single \u003Cem>Dockerfile\u003C/em>. This enables:\u003C/p>\n\u003Cul>\n\u003Cli>Building the application in one image (with development tools).\u003C/li>\n\u003Cli>Copying only the build results to a lightweight production image.\u003C/li>\n\u003Cli>Drastically reducing the size of the final image.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Example \u003Cem>multi-stage build\u003C/em>\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Stage 1: Building (large image with dev tools)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Etap 1: Budowanie (duży obraz z narzędziami)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18 \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> builder\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm run build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># This image can be 500MB+ / Ten obraz może mieć 500MB+\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Stage 2: Production (lightweight image)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Etap 2: Produkcja (lekki obraz)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18-alpine \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy only build results / Kopiujemy tylko wyniki budowania\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --from=builder /app/dist ./dist\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --from=builder /app/node_modules ./node_modules\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Final image: ~150MB / Końcowy obraz: ~150MB\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>Other size optimization techniques\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Clean package manager cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Oczyszczanie cache'u menedżera pakietów\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install &#x26;&#x26; npm cache clean --force\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Remove unnecessary system files\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Usuwanie niepotrzebnych plików systemowych\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get update &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    apt-get install -y curl &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    rm -rf /var/lib/apt/lists/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Use specific versions for reproducibility\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Używanie konkretnych wersji dla powtarzalności\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18.17.0-alpine3.18\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"example-of-a-comprehensive-dockerfile-for-python-and-node-applications\" tabindex=\"-1\">Example of a comprehensive Dockerfile for Python and Node applications\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Node\u003C/strong>\u003C/li>\n\u003C/ul>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Build stage - use slim for build tools / Etap budowania - używamy slim dla narzędzi budowania\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:22.12.0-slim \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> builder\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set working directory / Ustawienie katalogu roboczego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy package files first for better layer caching / Kopiowanie plików package jako pierwsze dla lepszego cache warstw\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Install all dependencies including dev dependencies / Instalacja wszystkich zależności włącznie z dev\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    npm cache clean --force\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy source code / Kopiowanie kodu źródłowego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Build the application / Budowanie aplikacji\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm run build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Production stage - use alpine for smaller size / Etap produkcyjny - używamy alpine dla mniejszego rozmiaru\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:22.12.0-alpine \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Create non-root user for security / Tworzenie użytkownika non-root dla bezpieczeństwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> addgroup -g 1001 -S nodejs &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    adduser -S nextjs -u 1001 -G nodejs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set working directory / Ustawienie katalogu roboczego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy built application with proper ownership / Kopiowanie zbudowanej aplikacji z właściwymi uprawnieniami\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --from=builder --chown=nextjs:nodejs /app/.output ./.output\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set environment variable / Ustawienie zmiennej środowiskowej\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">ENV\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> DOCKER=true \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    NODE_ENV=production\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Switch to non-root user / Przełączenie na użytkownika non-root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">USER\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> nextjs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Expose port / Udostępnienie portu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">EXPOSE\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> 3000\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Run the application / uruch aplikacji\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">CMD\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"node\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\".output/server/index.mjs\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cem>\u003Cstrong>.dockerignore\u003C/strong>\u003C/em> for the project\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">node_modules/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">npm-debug.log*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">yarn-debug.log*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">yarn-error.log*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.env*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.DS_Store\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.log\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">coverage/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.nyc_output/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cul>\n\u003Cli>\u003Cstrong>Python\u003C/strong>\u003C/li>\n\u003C/ul>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Use Python Alpine for smaller image size / Używamy Python Alpine dla mniejszego rozmiaru obrazu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> python:3.13.3-alpine \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> base\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Install system dependencies needed for Python packages / Instalacja zależności systemowych potrzebnych dla pakietów Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apk add --no-cache \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    gcc \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    musl-dev \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    libffi-dev \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    postgresql-dev \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    &#x26;&#x26; rm -rf /var/cache/apk/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set working directory / Ustawienie katalogu roboczego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Create non-root user / Tworzenie użytkownika non-root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> addgroup -g 1001 -S python &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    adduser -S pyuser -u 1001 -G python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy requirements first for better caching / Kopiowanie requirements jako pierwsze dla lepszego cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> requirements.txt .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Upgrade pip and install Python dependencies / Aktualizacja pip i instalacja zależności Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> pip install --no-cache-dir --upgrade pip &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    pip install --no-cache-dir -r requirements.txt\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy application code with proper ownership / Kopiowanie kodu aplikacji z właściwymi uprawnieniami\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --chown=pyuser:python . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set Python environment variables / Ustawienie zmiennych środowiskowych Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">ENV\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> PYTHONPATH=/app \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    PYTHONUNBUFFERED=1 \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    PYTHONDONTWRITEBYTECODE=1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Switch to non-root user / Przełączenie na użytkownika non-root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">USER\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> pyuser\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Expose port / Udostępnienie portu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">EXPOSE\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> 8000\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Run the application / Uruchomienie aplikacji\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">CMD\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"python\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"main.py\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>\u003Cem>.dockerignore\u003C/em> for the project\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">__pycache__/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.py[cod]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*$py.class\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.so\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">build/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">develop-eggs/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">dist/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">downloads/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">eggs/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.eggs/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">lib/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">lib64/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">parts/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">sdist/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">var/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">wheels/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.egg-info/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.installed.cfg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.egg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.env\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">venv/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">ENV/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">env/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n","\u003Ch2 id=\"wprowadzenie-do-konteneryzacji-i-dockera-od-pomysu-do-praktyki\" tabindex=\"-1\">Wprowadzenie do Konteneryzacji i Dockera: Od Pomysłu do Praktyki\u003C/h2>\n\u003Cp>Rozpoczęcie pracy z Dockerem i konteneryzacją może na początku wydawać się trudne i przytłaczające. W tym artykule przybliżę Ci podstawowe pojęcia związane z konteneryzacją oraz pokażę przykłady kontenerów dla aplikacji Full Stack wraz z najlepszymi praktykami.\u003C/p>\n\u003Ch3 id=\"czym-jest-konteneryzacja\" tabindex=\"-1\">Czym jest konteneryzacja?\u003C/h3>\n\u003Cp>Wyobraź sobie, że Twoja aplikacja to skomplikowana maszyna, która do działania potrzebuje nie tylko samego kodu, ale też konkretnych bibliotek, zależności i ustawień systemowych. Tradycyjnie uruchomienie jej na innym komputerze (np. serwerze produkcyjnym) często prowadziło do problemów typu „u mnie działa poprawnie&quot;.\u003C/p>\n\u003Cp>\u003Cstrong>Konteneryzacja\u003C/strong> to technologia, która rozwiązuje ten problem. Polega na „zapakowaniu&quot; aplikacji razem ze wszystkimi jej zależnościami (bibliotekami, plikami konfiguracyjnymi, środowiskiem uruchomieniowym) w jedną, przenośną paczkę zwaną \u003Cstrong>kontenerem\u003C/strong>. Taki kontener jest w pełni odizolowany od reszty systemu i innych kontenerów. Działa zawsze tak samo – niezależnie od tego, czy uruchomisz go na swoim laptopie, serwerze w chmurze, czy na komputerze na drugim końcu świata.\u003C/p>\n\u003Ch3 id=\"kontenery-a-maszyny-wirtualne-vm\" tabindex=\"-1\">Kontenery a maszyny wirtualne \u003Cem>(VM)\u003C/em>\u003C/h3>\n\u003Cp>Kontenery często porównuje się do maszyn wirtualnych, ale różnice między nimi są kluczowe. Maszyna wirtualna emuluje cały system operacyjny, włącznie z jądrem, co wymaga znacznych zasobów (RAM, CPU, przestrzeń dyskowa). Kontenery współdzielą jądro systemu operacyjnego gospodarza i izolują jedynie środowisko uruchomieniowe aplikacji.\u003C/p>\n\u003Cp>Dzięki temu kontenery są:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Lżejsze i szybsze\u003C/strong> – uruchamiają się w kilka sekund, a nie minut.\u003C/li>\n\u003Cli>\u003Cstrong>Efektywniejsze\u003C/strong> – zużywają znacznie mniej zasobów systemowych.\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"czym-jest-docker\" tabindex=\"-1\">Czym jest Docker?\u003C/h3>\n\u003Cp>\u003Cstrong>Docker\u003C/strong> to najpopularniejsza platforma do tworzenia, uruchamiania i zarządzania kontenerami. To właśnie Docker spopularyzował ideę konteneryzacji i dostarczył proste w obsłudze narzędzia, które umożliwiają wykorzystanie jej w codziennej pracy deweloperskiej.\u003C/p>\n\u003Cp>Podstawowe elementy Dockera:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Dockerfile\u003C/strong> – prosty plik tekstowy zawierający instrukcje, jak zbudować obraz kontenera. To przepis na Twoją aplikację.\u003C/li>\n\u003Cli>\u003Cstrong>Image (obraz)\u003C/strong> – szablon tylko do odczytu, powstały na podstawie Dockerfile. Zawiera wszystko, co jest potrzebne do uruchomienia aplikacji.\u003C/li>\n\u003Cli>\u003Cstrong>Container (kontener)\u003C/strong> – uruchomiona instancja obrazu. To „żywa&quot; wersja Twojej aplikacji.\u003C/li>\n\u003Cli>\u003Cstrong>Docker Engine\u003C/strong> – silnik działający w tle, który odpowiada za budowanie i uruchamianie kontenerów.\u003C/li>\n\u003C/ul>\n\u003Cp>Najprostszym narzędziem do rozpoczęcia pracy z Dockerem jest \u003Cstrong>Docker Desktop\u003C/strong>\n(\u003Ca href=\"https://www.docker.com/products/docker-desktop\" target=\"_blank\" rel=\"noopener noreferrer\">docker.com/products/docker-desktop\u003C/a>).\u003C/p>\n\u003Ch3 id=\"dlaczego-warto-konteneryzowac-aplikacje\" tabindex=\"-1\">Dlaczego warto konteneryzować aplikacje?\u003C/h3>\n\u003Cp>Docker i konteneryzacja oferują szereg korzyści, które sprawiają, że są dziś nieodłącznym elementem nowoczesnego programowania:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Spójność środowisk\u003C/strong> – koniec z problemem „działa tylko u mnie&quot;. Aplikacja działa identycznie w każdym środowisku.\u003C/li>\n\u003Cli>\u003Cstrong>Przenośność\u003C/strong> – kontener można uruchomić na dowolnym systemie z Dockerem.\u003C/li>\n\u003Cli>\u003Cstrong>Szybkie wdrażanie\u003C/strong> – nowe wersje aplikacji można wdrożyć i uruchomić w kilka sekund.\u003C/li>\n\u003Cli>\u003Cstrong>Izolacja i bezpieczeństwo\u003C/strong> – aplikacje działają w odizolowanych środowiskach, więc awaria jednej nie wpływa na inne.\u003C/li>\n\u003Cli>\u003Cstrong>Wydajność\u003C/strong> – kontenery są lekkie, dzięki czemu można uruchomić ich więcej na tym samym serwerze, co redukuje koszty.\u003C/li>\n\u003Cli>\u003Cstrong>Skalowalność\u003C/strong> – większy ruch? Po prostu uruchamiasz więcej kontenerów.\u003C/li>\n\u003Cli>\u003Cstrong>Integracja z DevOps i CI/CD\u003C/strong> – Docker świetnie współpracuje z pipeline'ami automatyzacji, testowania i deploymentu.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"dockerfile-tworzenie-obrazu\" tabindex=\"-1\">\u003Cem>Dockerfile\u003C/em>: Tworzenie obrazu\u003C/h2>\n\u003Cp>Dobrze napisany \u003Cem>Dockerfile\u003C/em> to klucz do stworzenia lekkiego, bezpiecznego i wydajnego obrazu. Oto kilka wytycznych do stworzenia lepszego obrazu:\u003C/p>\n\u003Ch3 id=\"wybor-odpowiedniego-obrazu-bazowego\" tabindex=\"-1\">Wybór odpowiedniego obrazu bazowego\u003C/h3>\n\u003Cp>\u003Cstrong>Obraz bazowy\u003C/strong>, to podstawa, na której budujesz swój kontener. Zawiera gotowy system operacyjny z prenstalowanymi narzędziami, który stanowi punkt wyjścia dla Twojej aplikacji. Wybór obrazu bazowego ma ogromny wpływ na bezpieczeństwo, rozmiar i wydajność końcowego kontenera.\u003C/p>\n\u003Cp>Obrazy możemy sprawdzić, porównać i wybrać na \u003Ca href=\"https://hub.docker.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Hub\u003C/a>.\u003C/p>\n\u003Cp>\u003Cstrong>Rodzaje obrazów bazowych:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Oficjalne obrazy\u003C/strong> (np. \u003Ccode>node:18\u003C/code>, \u003Ccode>python:3.11\u003C/code>) – utrzymane przez Docker Hub, regularnie aktualizowane.\u003C/li>\n\u003Cli>\u003Cstrong>Obrazy \u003Cem>Alpine\u003C/em>\u003C/strong> (np. \u003Ccode>node:18-alpine\u003C/code>) – minimalistyczne, oparte na \u003Cem>Alpine Linux\u003C/em>, bardzo lekkie (~5MB).\u003C/li>\n\u003Cli>\u003Cstrong>Obrazy \u003Cem>distroless\u003C/em>\u003C/strong> – zawierają tylko niezbędne biblioteki do uruchomienia aplikacji, bez powłoki systemowej.\u003C/li>\n\u003C/ul>\n\u003Cp>Generalną zasadą wybierania obrazów podstawowych jest używanie najmniejszych możliwych obrazów, chyba że brak wymaganych bibliotek powoduje błędy w aplikacji.\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Good choice - official, lightweight Alpine image\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Dobry wybór - oficjalny, lekki obraz Alpine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18-alpine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Size: ~110MB / Rozmiar: ~110MB\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Avoid - too heavy image with full Ubuntu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Unikaj - zbyt ciężki obraz z pełnym Ubuntu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> ubuntu:latest\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Size: ~800MB+ after installing Node.js / Rozmiar: ~800MB+ po zainstalowaniu Node.js\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># For Go applications - distroless for maximum security\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Dla aplikacji Go - distroless dla maksymalnego bezpieczeństwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> gcr.io/distroless/static-debian11\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Size: ~2MB, no system shell / Rozmiar: ~2MB, brak powłoki systemowej\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"minimalizacja-warstw\" tabindex=\"-1\">Minimalizacja warstw\u003C/h3>\n\u003Cp>\u003Cstrong>Czym są warstwy w Docker?\u003C/strong> Każda instrukcja w Dockerfile \u003Cem>(RUN, COPY, ADD)\u003C/em> tworzy nową warstę w obrazie. Warstwy to pliki tylko do odczytu, które są nakładane jedna na drugą. Więcej warstw oznacza większy rozmiar obrazu i dłuższy czas budowania.\u003C/p>\n\u003Cp>\u003Cstrong>Jak działają warstwy:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Każda warstwa przechowuje tylko zmiany względem poprzedniej warstwy.\u003C/li>\n\u003Cli>Warstwy są współdzielone między obrazami (oszczędność miejsca).\u003C/li>\n\u003Cli>Modyfikacja jednej warstwy wymaga przebudowania wszystkich następnych warstw.\u003C/li>\n\u003C/ul>\n\u003Cp>Warstwy można łączyć ze sobą za pomocą \u003Ccode>&amp;&amp;\u003C/code>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Better approach - single layer\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Lepsze podejście - jedna warstwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get update &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    apt-get install -y \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        curl \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        wget \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        git &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    apt-get clean &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    rm -rf /var/lib/apt/lists/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Result: 1 layer / Rezultat: 1 warstwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Avoid - multiple layers\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Unikaj - wiele warstw\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get update\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get install -y curl\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get install -y wget\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get install -y git\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get clean\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> rm -rf /var/lib/apt/lists/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Result: 6 layers (larger image) / Rezultat: 6 warstw (większy obraz)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"wykorzystanie-cacheu-warstw\" tabindex=\"-1\">Wykorzystanie \u003Cem>cache'u\u003C/em> warstw\u003C/h3>\n\u003Cp>\u003Cstrong>Jak działa \u003Cem>cache\u003C/em> warstw?\u003C/strong> Docker wykorzystuje \u003Cem>cache\u003C/em> podczas budowania obrazów. Gdy instrukcja w \u003Cem>Dockerfile\u003C/em> nie zmieniła się od ostatniego \u003Cem>builda\u003C/em>, Docker używa wcześniej zbudowanej warstwy zamiast budować ją ponownie. Cache jest sprawdzany na podstawie:\u003C/p>\n\u003Cul>\n\u003Cli>Treści instrukcji.\u003C/li>\n\u003Cli>Plików kopiowanych do kontenera.\u003C/li>\n\u003Cli>Kontekstu budowania.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Strategia \u003Cem>cache-friendly\u003C/em>:\u003C/strong> Umieszczaj instrukcje, które rzadko się zmianiają, na początku pliku. Kod aplikacji, który zmienia się najczęściej umieszczaj na końcu.\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18-alpine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># These files change rarely - good for cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Te pliki zmieniają się rzadko - dobre dla cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache will be used if package.json hasn't changed\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache zostanie użyty jeśli package.json się nie zmienił\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Application code changes frequently - at the end\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Kod aplikacji zmienia się często - na końcu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm run build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache will be invalidated on every code change\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Cache zostanie unieważniony przy każdej zmianie kodu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>Przykład unieważnienia \u003Cem>cache\u003C/em> (Unikaj!)\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># If you change app.js, cache will be invalidated from this point\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Jeśli zmienisz app.js, cache zostanie unieważniony od tego momentu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> app.js ./               # Cache miss - file changed / Cache miss - plik się zmienił\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install             # Will be executed again / Zostanie wykonane ponownie\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package.json ./    # Will be executed again / Zostanie wykonane ponownie\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"tworzenie-dockerignore\" tabindex=\"-1\">Tworzenie \u003Cem>.dockerignore\u003C/em>\u003C/h3>\n\u003Cp>\u003Cstrong>Czym jest \u003Cem>.dockerignore\u003C/em>?\u003C/strong> Plik \u003Cem>.dockerignore\u003C/em> działa podobnie do \u003Cem>.gitignore\u003C/em> – definiuje pliki i katalogi, które mają być wykluczone z kontekstu budowania Docker. Kontekst budowania to wszystkie pliki i katalogi przesyłane do \u003Cem>Docker daemon\u003C/em> podczas budowania obrazu.\u003C/p>\n\u003Cp>\u003Cstrong>Dlaczego jest ważny:\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Zmniejsza rozmiar kontekstu budowania.\u003C/li>\n\u003Cli>Przyspiesza transfer danych do \u003Cem>Docker deamon\u003C/em>.\u003C/li>\n\u003Cli>Zapobiega przypadkowemu skopiowaniu wrażliwych danych.\u003C/li>\n\u003Cli>Poprawia bezpieczeństwo.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Przykładowy plik \u003Cem>.dockerignore\u003C/em>\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">node_modules/        # Dependencies will be installed in container / Zależności będą zainstalowane w kontenerze\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.git/                # Git history not needed in container / Historia Git nie jest potrzebna w kontenerze\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.DS_Store            # macOS system files / Pliki systemowe macOS\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.env                 # Environment variables (may contain passwords) / Zmienne środowiskowe (mogą zawierać hasła)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">README.md            # Documentation / Dokumentacja\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.dockerignore        # The .dockerignore file itself / Sam plik .dockerignore\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">Dockerfile           # The Dockerfile itself / Plik Dockerfile\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.log                # Log files / Pliki logów\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">coverage/            # Test reports / Raporty testów\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.nyc_output/         # Coverage data / Dane coverage\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"bezpieczenstwo\" tabindex=\"-1\">Bezpieczeństwo\u003C/h3>\n\u003Cp>\u003Cstrong>Dlaczego nie uruchamiać jako \u003Cem>root\u003C/em>?\u003C/strong> Domyślnie kontenery Docker uruchamiają się jako \u003Cem>root\u003C/em>, co oznacza że mają pełny dostęp do wszystkich funkcjonalności i plików systemu. Jest to zagrożenie bezpieczeństwa, ponieważ:\u003C/p>\n\u003Cul>\n\u003Cli>Aplikacja ma pełne uprawnienia w kontenerze.\u003C/li>\n\u003Cli>W przypadku wycieku z kontenera, atakujący ma uprawnienia \u003Cem>root\u003C/em>.\u003C/li>\n\u003Cli>Narusza zasadę najmniejszych uprawnień.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Tworzenie dedykowanego użytkownika\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Create group and user\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Tworzenie grupy i użytkownika\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> addgroup -g 1001 -S nodejs &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    adduser -S nextjs -u 1001 -G nodejs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set file ownership\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Ustawienie właściciela plików\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --chown=nextjs:nodejs . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Switch to non-privileged user\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Przełączenie na użytkownika bez uprawnień\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">USER\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> nextjs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"optymalizacja-rozmiaru\" tabindex=\"-1\">Optymalizacja rozmiaru\u003C/h3>\n\u003Cp>\u003Cstrong>Czym są \u003Cem>multi-stage builds\u003C/em>?\u003C/strong> \u003Cem>Multi-stage builds\u003C/em> pozwalają na używanie wielu obrazów bazowych w jednym \u003Cem>Dockerfile\u003C/em>. Umożliwia to:\u003C/p>\n\u003Cul>\n\u003Cli>Budowanie aplikacji w jednym obrazie (z narzędziami deweloperskimi).\u003C/li>\n\u003Cli>Kopiowanie tylko wyników budowania do lekkiego obrazu produkcyjnego.\u003C/li>\n\u003Cli>Drastyczne zmniejszego rozmiaru końcowego obrazu.\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Przykład \u003Cem>multi-stage build\u003C/em>\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Stage 1: Building (large image with dev tools)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Etap 1: Budowanie (duży obraz z narzędziami)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18 \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> builder\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm run build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># This image can be 500MB+ / Ten obraz może mieć 500MB+\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Stage 2: Production (lightweight image)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Etap 2: Produkcja (lekki obraz)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18-alpine \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy only build results / Kopiujemy tylko wyniki budowania\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --from=builder /app/dist ./dist\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --from=builder /app/node_modules ./node_modules\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Final image: ~150MB / Końcowy obraz: ~150MB\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>Inne techniki optymalizacji rozmiaru\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Clean package manager cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Oczyszczanie cache'u menedżera pakietów\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install &#x26;&#x26; npm cache clean --force\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Remove unnecessary system files\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Usuwanie niepotrzebnych plików systemowych\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apt-get update &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    apt-get install -y curl &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    rm -rf /var/lib/apt/lists/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Use specific versions for reproducibility\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Używanie konkretnych wersji dla powtarzalności\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:18.17.0-alpine3.18\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3 id=\"przykad-kompleksowego-dockerfile-dla-aplikacji-python-i-node\" tabindex=\"-1\">Przykład kompleksowego Dockerfile dla aplikacji Python i Node\u003C/h3>\n\u003Cul>\n\u003Cli>\u003Cstrong>Node\u003C/strong>\u003C/li>\n\u003C/ul>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Build stage - use slim for build tools / Etap budowania - używamy slim dla narzędzi budowania\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:22.12.0-slim \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> builder\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set working directory / Ustawienie katalogu roboczego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy package files first for better layer caching / Kopiowanie plików package jako pierwsze dla lepszego cache warstw\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> package*.json ./\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Install all dependencies including dev dependencies / Instalacja wszystkich zależności włącznie z dev\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm install &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    npm cache clean --force\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy source code / Kopiowanie kodu źródłowego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Build the application / Budowanie aplikacji\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> npm run build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Production stage - use alpine for smaller size / Etap produkcyjny - używamy alpine dla mniejszego rozmiaru\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> node:22.12.0-alpine \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> runner\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Create non-root user for security / Tworzenie użytkownika non-root dla bezpieczeństwa\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> addgroup -g 1001 -S nodejs &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    adduser -S nextjs -u 1001 -G nodejs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set working directory / Ustawienie katalogu roboczego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy built application with proper ownership / Kopiowanie zbudowanej aplikacji z właściwymi uprawnieniami\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --from=builder --chown=nextjs:nodejs /app/.output ./.output\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set environment variable / Ustawienie zmiennej środowiskowej\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">ENV\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> DOCKER=true \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    NODE_ENV=production\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Switch to non-root user / Przełączenie na użytkownika non-root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">USER\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> nextjs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Expose port / Udostępnienie portu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">EXPOSE\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> 3000\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Run the application / uruch aplikacji\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">CMD\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"node\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\".output/server/index.mjs\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cem>\u003Cstrong>.dockerignore\u003C/strong>\u003C/em> dla projektu\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">node_modules/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">npm-debug.log*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">yarn-debug.log*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">yarn-error.log*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.env*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.DS_Store\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.log\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">coverage/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.nyc_output/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cul>\n\u003Cli>\u003Cstrong>Python\u003C/strong>\u003C/li>\n\u003C/ul>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Use Python Alpine for smaller image size / Używamy Python Alpine dla mniejszego rozmiaru obrazu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">FROM\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> python:3.13.3-alpine \u003C/span>\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">AS\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> base\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Install system dependencies needed for Python packages / Instalacja zależności systemowych potrzebnych dla pakietów Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> apk add --no-cache \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    gcc \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    musl-dev \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    libffi-dev \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    postgresql-dev \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    &#x26;&#x26; rm -rf /var/cache/apk/*\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set working directory / Ustawienie katalogu roboczego\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">WORKDIR\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> /app\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Create non-root user / Tworzenie użytkownika non-root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> addgroup -g 1001 -S python &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    adduser -S pyuser -u 1001 -G python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy requirements first for better caching / Kopiowanie requirements jako pierwsze dla lepszego cache\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> requirements.txt .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Upgrade pip and install Python dependencies / Aktualizacja pip i instalacja zależności Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">RUN\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> pip install --no-cache-dir --upgrade pip &#x26;&#x26; \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    pip install --no-cache-dir -r requirements.txt\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Copy application code with proper ownership / Kopiowanie kodu aplikacji z właściwymi uprawnieniami\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">COPY\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> --chown=pyuser:python . .\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Set Python environment variables / Ustawienie zmiennych środowiskowych Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">ENV\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> PYTHONPATH=/app \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    PYTHONUNBUFFERED=1 \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    PYTHONDONTWRITEBYTECODE=1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Switch to non-root user / Przełączenie na użytkownika non-root\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">USER\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> pyuser\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Expose port / Udostępnienie portu\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">EXPOSE\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> 8000\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#6A737D, #6A737D);--shiki-light:#6A737D;--shiki-dark:#6A737D\"># Run the application / Uruchomienie aplikacji\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#D73A49, #F97583);--shiki-light:#D73A49;--shiki-dark:#F97583\">CMD\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"python\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:light-dark(#032F62, #9ECBFF);--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"main.py\"\u003C/span>\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>\u003Cem>.dockerignore\u003C/em> dla projektu\u003C/strong>\u003C/p>\n\u003Cpre class=\"shiki shiki-themes github-light github-dark\" style=\"background-color:light-dark(#fff, #24292e);--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;color:light-dark(#24292e, #e1e4e8);--shiki-light:#24292e;--shiki-dark:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">__pycache__/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.py[cod]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*$py.class\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.so\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.Python\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">build/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">develop-eggs/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">dist/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">downloads/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">eggs/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.eggs/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">lib/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">lib64/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">parts/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">sdist/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">var/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">wheels/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.egg-info/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.installed.cfg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">*.egg\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.env\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">venv/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">ENV/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:light-dark(#24292E, #E1E4E8);--shiki-light:#24292E;--shiki-dark:#E1E4E8\">env/\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\u003C/code>\u003C/pre>\n",{"en":31,"pl":77},[32,35,38,42,46,50,53,56,59,62,65,69,73],{"id":33,"title":34,"mainLevel":25,"subLevel":15},"introduction-to-containerization-and-docker-from-idea-to-practice","Introduction to Containerization and Docker: From Idea to Practice",{"id":36,"title":37,"mainLevel":25,"subLevel":25},"what-is-containerization","What is Containerization?",{"id":39,"title":40,"mainLevel":25,"subLevel":41},"containers-vs-virtual-machines-vm","Containers vs. Virtual Machines (VM)",2,{"id":43,"title":44,"mainLevel":25,"subLevel":45},"what-is-docker","What is Docker?",3,{"id":47,"title":48,"mainLevel":25,"subLevel":49},"why-containerize-applications","Why Containerize Applications?",4,{"id":51,"title":52,"mainLevel":41,"subLevel":15},"dockerfile-creating-an-image","Dockerfile: Creating an Image",{"id":54,"title":55,"mainLevel":41,"subLevel":25},"choosing-the-right-base-image","Choosing the Right Base Image",{"id":57,"title":58,"mainLevel":41,"subLevel":41},"layer-minimization","Layer Minimization",{"id":60,"title":61,"mainLevel":41,"subLevel":45},"utilizing-layer-cache","Utilizing Layer Cache",{"id":63,"title":64,"mainLevel":41,"subLevel":49},"creating-dockerignore","Creating .dockerignore",{"id":66,"title":67,"mainLevel":41,"subLevel":68},"security","Security",5,{"id":70,"title":71,"mainLevel":41,"subLevel":72},"size-optimization","Size Optimization",6,{"id":74,"title":75,"mainLevel":41,"subLevel":76},"example-of-a-comprehensive-dockerfile-for-python-and-node-applications","Example of a comprehensive Dockerfile for Python and Node applications",7,[78,81,84,87,90,93,96,99,102,105,108,111,114],{"id":79,"title":80,"mainLevel":25,"subLevel":15},"wprowadzenie-do-konteneryzacji-i-dockera-od-pomysu-do-praktyki","Wprowadzenie do Konteneryzacji i Dockera: Od Pomysłu do Praktyki",{"id":82,"title":83,"mainLevel":25,"subLevel":25},"czym-jest-konteneryzacja","Czym jest konteneryzacja?",{"id":85,"title":86,"mainLevel":25,"subLevel":41},"kontenery-a-maszyny-wirtualne-vm","Kontenery a maszyny wirtualne (VM)",{"id":88,"title":89,"mainLevel":25,"subLevel":45},"czym-jest-docker","Czym jest Docker?",{"id":91,"title":92,"mainLevel":25,"subLevel":49},"dlaczego-warto-konteneryzowac-aplikacje","Dlaczego warto konteneryzować aplikacje?",{"id":94,"title":95,"mainLevel":41,"subLevel":15},"dockerfile-tworzenie-obrazu","Dockerfile: Tworzenie obrazu",{"id":97,"title":98,"mainLevel":41,"subLevel":25},"wybor-odpowiedniego-obrazu-bazowego","Wybór odpowiedniego obrazu bazowego",{"id":100,"title":101,"mainLevel":41,"subLevel":41},"minimalizacja-warstw","Minimalizacja warstw",{"id":103,"title":104,"mainLevel":41,"subLevel":45},"wykorzystanie-cacheu-warstw","Wykorzystanie cache'u warstw",{"id":106,"title":107,"mainLevel":41,"subLevel":49},"tworzenie-dockerignore","Tworzenie .dockerignore",{"id":109,"title":110,"mainLevel":41,"subLevel":68},"bezpieczenstwo","Bezpieczeństwo",{"id":112,"title":113,"mainLevel":41,"subLevel":72},"optymalizacja-rozmiaru","Optymalizacja rozmiaru",{"id":115,"title":116,"mainLevel":41,"subLevel":76},"przykad-kompleksowego-dockerfile-dla-aplikacji-python-i-node","Przykład kompleksowego Dockerfile dla aplikacji Python i Node",1781735646106]