====== erstes Docker Image selbst bauen ====== ===== Pakete ===== === Rocky Linux (10): === dnf config-manager --enable crb dnf install -y epel-release dnf install -y debootstrap === Debian (ab 12) === apt install -y debootstrap ===== Image bauen ===== (( anders als das Image aus https://hub.docker.com/_/debian ist dieses Image nicht reproduzierbar )) sudo debootstrap --variant=minbase trixie ./debian http://debian/debian (( unter RockyLinux ''--keyring'' ergänzen: sudo debootstrap --variant=minbase --keyring=/usr/share/keyrings/debian-archive-trixie-stable.gpg trixie ./debian http://debian.linuxhotel.de/debian )) sudo tar cC debian/ . | docker image import - ingo/debian:trixie Tag ''latest'' hinzufügen: docker image ls ingo/debian:trixie -> id rauskopieren (z.B. ''dc9f1edde160'') docker image tag dc9f1edde160 ingo/debian:latest ==== testen ==== docker container run ingo/debian echo hello world -> ''hello world'' ====== Dockerfile - Docker Images weiterbauen ====== mkdir nginx cd nginx ++++ podman | bei Podman darf die Datei auch ''Containerfile'' heißen ++++ FROM ingo/debian:trixie ENV DEBIAN_FRONTEND=noninteractive RUN set -eux; \ apt-get -qq update; \ apt-get install -y --no-install-recommends nginx RUN echo 'A warm welcome from your Dockerfile' > /var/www/html/index.html EXPOSE 80 ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] ARG REFRESHED_AT=2026-01-07 LABEL version="0.0.1" LABEL maintainer="me@example.com" LABEL org.opencontainers.image.authors="me@example.com" LABEL org.opencontainers.image.created=$REFRESHED_AT (( https://docs.docker.com/reference/dockerfile/ )) ++++ ENTRYPOINT / CMD / run-Command | ^ ''ENTRYPOINT'' ^ ''CMD'' ^ run-Command ^ ausgeführt wird ^ |["script.sh"]| | | script.sh | |["script.sh"]| | /bin/dash | script.sh /bin/dash | |["script.sh"]| ["httpd"] | | script.sh httpd | |["script.sh"]| ["httpd"] | /bin/dash | script.sh /bin/dash | | | ["/bin/sh"] | | /bin/sh | | | ["/bin/sh"] | /bin/dash | /bin/dash | | | | | /bin/bash (( https://docs.docker.com/reference/dockerfile/#understand-how-cmd-and-entrypoint-interact sagt ''error, not allowed''. Docker Version 20.10.24+dfsg1 hat ''bash'' ausgeführt.)) | ++++ Image mit den Erweiterungen aus dem ''Dockerfile'' bauen: docker build -t='ingo/nginx:0.0.1' . Image anzeigen: docker image ls ingo/nginx:0.0.1 -> id rauskopieren (z.B. ''5879d7773761'') Image taggen: docker image tag 5879d7773761 ingo/nginx:latest Container starten: docker container run -d -p 80:80 --name my_nginx ingo/nginx Zugriff auf nginx testen: curl -s http://localhost:80 -> im Browser http://localhost öffnen ====== Docker Image aktualisieren ====== … RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log … docker build --no-cache --pull -t='ingo/nginx:0.0.2' . ++++ podman | podman build --no-cache -t='ingo/nginx:0.0.2' . -> allerdings werden dann alle 12 STEPs neu gebaut. TODO: liegt das an dem fehlenden --pull? AI Slop Vermutung: Docker built your image without errors because it keeps un-namespaced local images as-is. In contrast, Podman automatically prefixes locally built or untagged registry images with localhost/ to prevent collisions with official registries. When you use the --pull flag, Podman is forced to try downloading a fresh version of that base image from an external source. Because it sees localhost/ingo/debian:trixie, Podman literally looks for a web-facing registry running on your actual machine (https://localhost/v2/). Since you don't have a container registry service actively running on port 443 of your host machine, the network request fails with "connection refused" Unter Debian mit Docker version 26.1.5+dfsg1, build a72d7cd klappt ''--pull'' auch nicht. ERROR: failed to solve: ingo/debian:trixie: failed to resolve source metadata for docker.io/ingo/debian:trixie: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed ++++ Jetzt noch mal Container starten und docker logs ansehen. Bauen mit einem Release Zeitstempel: REFRESHED_AT=$(date '+%Y-%m-%d') docker build --no-cache --pull \ --build-arg REFRESHED_AT=$REFRESHED_AT \ -t='ingo/nginx:0.0.2' \ -t=ingo/nginx:$REFRESHED_AT . Nginx as Systemd: mkdir ~/ubi9-nginx && cd ~/ubi9-nginx cat >Dockerfile </etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/rhel/9/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF RUN dnf -y install nginx \ && dnf clean all \ && systemctl enable nginx STOPSIGNAL SIGRTMIN+3 CMD ["/sbin/init"] EOR docker build -t ubi9-nginx-systemd:0.0.1 . docker run --name ubi9-nginx --privileged -d -p 8090:80 ubi9-nginx-systemd:0.0.1 docker exec -it ubi9-nginx nginx -v docker exec -it ubi9-nginx systemctl status docker exec -it ubi9-nginx journalctl -u nginx # ups.. docker logs ubi9-nginx # build with compose cat >compose.yml < ++++ this doesn't solve the console logging problem | cat >Dockerfile </etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/rhel/9/\$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF RUN dnf -y install nginx \ && dnf clean all # nginx logs to files (important for tail) RUN mkdir -p /var/log/nginx # systemd override for nginx RUN mkdir -p /etc/systemd/system/nginx.service.d && \ cat <<'EOF' >/etc/systemd/system/nginx.service.d/override.conf [Service] StandardOutput=journal StandardError=journal EOF # log forwarder service RUN cat <<'EOF' >/etc/systemd/system/nginx-log-forwarder.service [Unit] Description=Nginx log forwarder After=nginx.service Requires=nginx.service [Service] Type=simple ExecStart=/bin/sh -c '/usr/bin/tail -F /var/log/nginx/access.log /var/log/nginx/error.log' Restart=always [Install] WantedBy=multi-user.target EOF RUN systemctl enable nginx \ && systemctl enable nginx-log-forwarder STOPSIGNAL SIGRTMIN+3 CMD ["/sbin/init"] EOR # docker docker compose build docker compose up -d curl 127.0.0.1:8090 docker compose exec nginx systemctl status nginx-log-forwarder docker compose exec nginx journalctl -u nginx-log-forwarder # see access logs docker logs nginx_nginx_1 # podman podman compose build podman compose up -d curl 127.0.0.1:8090 podman compose exec nginx systemctl status nginx-log-forwarder podman compose exec nginx journalctl -u nginx-log-forwarder # see access logs podman logs nginx_nginx_1 # no logging output! ++++