{"id":383,"date":"2026-09-23T13:10:18","date_gmt":"2026-09-23T11:10:18","guid":{"rendered":"https:\/\/blog.ctr24.co.pl\/?p=383"},"modified":"2026-09-23T13:10:18","modified_gmt":"2026-09-23T11:10:18","slug":"sapo-dashboard-docker-cheatsheet","status":"publish","type":"post","link":"https:\/\/blog.ctr24.co.pl\/?p=383","title":{"rendered":"SAPO DASHBOARD &#8211; DOCKER CHEATSHEET"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Dockerfile<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM python:3.12-slim\n\nWORKDIR \/app\n\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY . .\n\nEXPOSE 5003\n\nCMD &#91;\"gunicorn\", \"--bind\", \"0.0.0.0:5003\", \"--workers\", \"2\", \"--threads\", \"4\", \"run:app\"]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">.dockerignore.txt<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>venv\/\n__pycache__\/\n*.pyc\n.git\/\n.env<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Katalog projektu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wszystkie ponizsze komendy uruchamiaj w katalogu projektu, czyli tam,<br>gdzie znajduja sie Dockerfile, requirements.txt i run.py.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sprawdzenie plikow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Get-ChildItem<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Przygotowanie obrazu Docker<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Budowa obrazu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t sapo-dashboard .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker                 uruchamia klienta Docker.\nbuild                  buduje obraz na podstawie Dockerfile.\n-t sapo-dashboard      nadaje obrazowi nazwe\/tag sapo-dashboard.\n.                      oznacza biezacy katalog jako kontekst budowania;\n                       Docker moze odczytac z niego Dockerfile i pliki\n                       kopiowane instrukcja COPY.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Obraz jest szablonem aplikacji. Samo jego zbudowanie nie uruchamia kontenera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Budowa od zera, bez uzywania cache:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build --no-cache -t sapo-dashboard .<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Parametr &#8211;no-cache wymusza wykonanie wszystkich krokow od poczatku.<br>Przydaje sie, gdy Docker uzywa starej warstwy lub gdy zmienily sie<br>zaleznosci. Budowa trwa wtedy dluzej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Po zmianie kodu lub requirements.txt wykonaj ponownie docker build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gunicorn musi znajdowac sie w requirements.txt, poniewaz Dockerfile uruchamia:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>gunicorn --bind 0.0.0.0:5003 --workers 2 --threads 4 run:app<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow Gunicorna:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>--bind 0.0.0.0:5003  nasluchuj na porcie 5003 na wszystkich interfejsach\n                      kontenera; 0.0.0.0 jest wazne w Dockerze.\n--workers 2           uruchom dwa procesy robocze obslugujace zadania.\n--threads 4           uruchom cztery watki w kazdym workerze.\nrun:app               wczytaj zmienna app z pliku\/modulu run.py.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Port po lewej stronie -p jest portem Windowsa, a port po prawej stronie<br>jest portem wewnatrz kontenera. Gunicorn musi nasluchiwac na tym drugim.<\/p>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Pierwsze uruchomienie z plikiem .env<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name sapo-dashboard `\n  --env-file .env `\n  -p 5003:5003 `\n  --restart unless-stopped `\n  sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>run                      utworz nowy kontener z obrazu i go uruchom.\n-d                       uruchom w tle (detached); terminal pozostaje\n                         dostepny, a aplikacja dziala w tle.\n--name sapo-dashboard    ustaw stala, latwa do uzycia nazwe kontenera.\n--env-file .env          wczytaj zmienne z pliku .env podczas tworzenia\n                         kontenera. Te wartosci zostana zapisane w jego\n                         konfiguracji i nie zmienia ich pozniejsze\n                         edytowanie pliku .env.\n-p 5003:5003             przekieruj port 5003 Windowsa na port 5003\n                         wewnatrz kontenera. Lewa wartosc to port lokalny.\n--restart unless-stopped uruchamiaj ponownie kontener po awarii lub\n                         restarcie Dockera, chyba ze zatrzymano go recznie.\nsapo-dashboard           obraz, z ktorego ma powstac kontener.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Znak ` na koncu linii jest kontynuacja polecenia w PowerShellu. Pozwala<br>zapisac jedno dlugie polecenie w kilku wierszach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Polecenie docker run wykonuje sie tylko przy pierwszym tworzeniu kontenera.<br>Jesli kontener o tej nazwie juz istnieje, uzyj docker start.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aplikacja bedzie dostepna pod adresem:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:5003<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Znaczenie opcji:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-d                         uruchomienie w tle\n--name                     nazwa kontenera\n--env-file .env            zaladowanie zmiennych z pliku .env\n-p 5003:5003               port komputera:port kontenera\n--restart unless-stopped   automatyczny restart kontenera<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nie dodawaj pliku .env do obrazu ani do repozytorium.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Kolejne uruchomienie istniejacego kontenera<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Jesli kontener zostal juz utworzony, nie uzywaj ponownie docker run.<br>Uzyj:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker start sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>start                    uruchom istniejacy, zatrzymany kontener.\nsapo-dashboard            nazwa kontenera ustawiona w docker run.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">docker start nie tworzy nowego kontenera, nie czyta ponownie pliku .env<br>i nie zmienia obrazu. Korzysta z konfiguracji zapisanej podczas docker run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Status kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Polecenie docker ps pokazuje tylko aktualnie dzialajace kontenery.<br>Najwazniejsze informacje to STATUS oraz PORTS, np. 0.0.0.0:5003-&gt;5003\/tcp.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Status wszystkich kontenerow, takze zatrzymanych:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker ps -a<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Parametr -a (all) pokazuje rowniez kontenery zatrzymane. Przydaje sie,<br>gdy docker start nie dziala albo trzeba sprawdzic istniejaca nazwe kontenera.<\/p>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Zmienne srodowiskowe<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Lista zmiennych zapisanych w konfiguracji kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker inspect --format '{{range .Config.Env}}{{println .}}{{end}}' sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do polecenia:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>inspect                  pokaz szczegolowa konfiguracje obiektu Docker.\n--format                  ogranicz wynik do wybranego formatu Go template.\n.Config.Env              wybierz zmienne zapisane w konfiguracji kontenera.\nrange ... println        wypisz kazda zmienna w osobnej linii.<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-pullquote\"><blockquote><p>!! <strong>To polecenie moze pokazac hasla i tokeny. Nie wklejaj jego pelnego wyniku<br>na publiczne fora ani do repozytorium.<\/strong>!!!<\/p><cite>UWAGA<\/cite><\/blockquote><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Lista zmiennych odczytanych wewnatrz dzialajacego kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec sapo-dashboard env<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>exec                     wykonaj polecenie wewnatrz dzialajacego kontenera.\nsapo-dashboard            wskaz kontener, w ktorym ma byc wykonane polecenie.\nenv                       wyswietl zmienne srodowiskowe procesu w kontenerze.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sprawdzenie pojedynczej zmiennej:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec sapo-dashboard printenv MYSQL_HOST\ndocker exec sapo-dashboard printenv MYSQL_DB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">printenv odczytuje jedna wskazana zmienna. Jest bezpieczniejsze do diagnostyki<br>niz wyswietlanie calego srodowiska, szczegolnie gdy chcesz sprawdzic tylko host<br>lub nazwe bazy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podglad lokalnego pliku .env:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Get-Content .env<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wazne: zmiana pliku .env nie zmienia zmiennych w istniejacym kontenerze.<br>Po zmianie .env trzeba usunac i utworzyc kontener ponownie.<\/p>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Logi<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Ostatnie logi kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker logs --tail 100 sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>logs                    pokaz standardowe wyjscie i bledy kontenera.\n--tail 100              pokaz tylko ostatnich 100 linii.\nsapo-dashboard           nazwa kontenera, ktorego logi chcesz zobaczyc.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Logi na zywo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker logs -f sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Parametr -f (follow) pozostawia polecenie aktywne i dopisuje nowe logi<br>na zywo. Zatrzymaj podglad klawiszami Ctrl+C; nie zatrzyma to kontenera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Logi na zywo z ostatnimi 100 liniami:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker logs -f --tail 100 sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zatrzymanie podgladu logow: Ctrl+C<\/p>\n\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Zatrzymanie i uruchomienie<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Zatrzymanie kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker stop sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">stop wysyla do procesu kontenera sygnal zakonczenia i zatrzymuje go,<br>ale nie usuwa kontenera ani jego konfiguracji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uruchomienie zatrzymanego kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker start sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Restart kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker restart sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">restart wykonuje stop, a nastepnie start tego samego kontenera.<\/p>\n\n\n\n<ol start=\"7\" class=\"wp-block-list\">\n<li>Zastosowanie zmienionego pliku .env<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Usun istniejacy kontener:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker rm -f sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Komentarze do parametrow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>rm                      usun kontener.\n-f                      wymus usuniecie; zatrzymaj kontener, jesli dziala.\nsapo-dashboard           kontener przeznaczony do usuniecia.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Po usunieciu kontenera znikaja zapisane w nim zmienne z .env. Obraz pozostaje<br>nienaruszony, dlatego mozna na jego podstawie utworzyc nowy kontener.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utworz go ponownie z aktualnym .env:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name sapo-dashboard `\n  --env-file .env `\n  -p 5003:5003 `\n  --restart unless-stopped `\n  sapo-dashboard<\/code><\/pre>\n\n\n\n<ol start=\"8\" class=\"wp-block-list\">\n<li>Przebudowa po zmianie kodu<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t sapo-dashboard .\ndocker rm -f sapo-dashboard\ndocker run -d --name sapo-dashboard `\n  --env-file .env `\n  -p 5003:5003 `\n  --restart unless-stopped `\n  sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Kolejnosc ma znaczenie: najpierw budujesz nowy obraz, potem usuwasz stary<br>kontener, a na koncu tworzysz kontener ponownie z aktualnego obrazu i .env.<\/p>\n\n\n\n<ol start=\"9\" class=\"wp-block-list\">\n<li>Usuwanie kontenera i obrazu<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Usuniecie zatrzymanego kontenera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker rm sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Usuniecie kontenera niezaleznie od jego stanu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker rm -f sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Lista obrazow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker images<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Usuniecie obrazu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker rmi sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">rmi (remove image) usuwa obraz. Nie usuwaj obrazu, jesli dzialajacy kontener<br>jest od niego zalezny lub jesli planujesz ponownie uruchomic ten kontener.<\/p>\n\n\n\n<ol start=\"10\" class=\"wp-block-list\">\n<li>Najczestsze problemy<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">Kontener nie startuje:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker logs sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Port 5003 jest zajety:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name sapo-dashboard-2 `\n  --env-file .env `\n  -p 8080:5003 `\n  sapo-dashboard<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">W tym poleceniu:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>   --name sapo-dashboard-2  uzywa innej nazwy, aby nie kolidowac z istniejacym\n                                                     kontenerem sapo-dashboard.\n    -p 8080:5003             wystawia port 8080 na Windowsie i kieruje go do\n                                                     portu 5003 w kontenerze. Nie zmienia portu Gunicorna.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wtedy aplikacja jest pod adresem <a href=\"http:\/\/localhost:8080\">http:\/\/localhost:8080<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Blad polaczenia z MySQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker exec sapo-dashboard printenv MYSQL_HOST<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">W pliku .env, uzywanym przez docker &#8211;env-file, nie otaczaj wartosci<br>apostrofami. Przyklad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MYSQL_HOST=db_host\nMYSQL_USER=db_user\nMYSQL_PASSWORD=haslo\nMYSQL_DB=db_table<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Docker Desktop musi dzialac, aby kontener mogl zostac uruchomiony.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dockerfile .dockerignore.txt Katalog projektu Wszystkie ponizsze komendy uruchamiaj w katalogu projektu, czyli tam,gdzie znajduja sie Dockerfile, requirements.txt i run.py. Sprawdzenie<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,6,19],"tags":[],"class_list":["post-383","post","type-post","status-publish","format-standard","hentry","category-bez-kategorii","category-python","category-tips"],"_links":{"self":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=383"}],"version-history":[{"count":5,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/383\/revisions"}],"predecessor-version":[{"id":388,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=\/wp\/v2\/posts\/383\/revisions\/388"}],"wp:attachment":[{"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.ctr24.co.pl\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}