Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


admin_grundlagen:docker:build

Dies ist eine alte Version des Dokuments!


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 aus tar-Archiv bauen

1)

sudo debootstrap --variant=minbase trixie ./debian http://deb.debian.org/debian

2) 3)

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 --rm ingo/debian apt update

→ Ausgabe von apt update ok?

4)

Image aus Dockerfile bauen

mkdir nginx
cd nginx

++++ podman | bei Podman darf die Datei auch Containerfile heißen ++++

Dockerfile
FROM ingo/debian:trixie
RUN set -eux; \
  mkdir -p /var/www/html; \
  echo 'A warm welcome from your Dockerfile' > /var/www/html/index.html
ARG REFRESHED_AT=1970-01-01
ENV DEBIAN_FRONTEND=noninteractive
RUN set -eux; \
  apt-get -qq update; \
  apt-get install -y --no-install-recommends nginx
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
 
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

5) ++++ 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

6)

++++ Image mit den Erweiterungen aus dem Dockerfile bauen: 7)

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 --rm -d -p 80:80 --name my_nginx ingo/nginx

Zugriff auf nginx testen:

curl -s http://localhost:80

oder im Browser http://localhost öffnen

Image aktualisieren

Wiederverwendung der Layer

docker build -t='ingo/nginx:0.0.1' .

→ CACHED oder Using cache … → Layer wird nicht aktualisiert

docker image inspect ingo/nginx:0.0.1 | jq -r '.[0].Config.Labels."org.opencontainers.image.created"'

→ gibt aus: 1970-01-01

Cache abschalten

docker build --no-cache -t='ingo/nginx:0.0.1' .

Bauen mit einem Release Zeitstempel

REFRESHED_AT=$(date '+%Y-%m-%d')
docker build --build-arg "REFRESHED_AT=$REFRESHED_AT" -t='ingo/nginx:0.0.1' .

→ alle Layer ab ARG REFRESHED_AT=1970-01-01 werden aktualisiert

Prüfen, ob der Zeitstempel aktuell ist:

docker image inspect ingo/nginx:0.0.1 | jq -r '.[0].Config.Labels."org.opencontainers.image.created"'

→ gibt aktuelles Datum aus

Logging hinzufügen

docker logs my_nginx

→ keine Logs :-(

Dockerfile
…
RUN set -eux; \
  ln -sf /dev/stdout /var/log/nginx/access.log; \
  ln -sf /dev/stderr /var/log/nginx/error.log;
…
docker build --no-cache -t='ingo/nginx:0.0.2' .

Jetzt noch mal Container starten und

docker logs my_nginx

ansehen.

TODO

++++ Nginx as Systemd |

mkdir ~/ubi9-nginx && cd ~/ubi9-nginx
cat >Dockerfile <<EOR
FROM registry.access.redhat.com/ubi9/ubi-init
RUN cat <<'EOF' >/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 <<EOR
services:
  nginx:
    build: .
    privileged: true
    ports:
      - "8090:80"    
    tmpfs:
      - /run
      - /run/lock
      - /tmp
    stop_signal: SIGRTMIN+3
EOR
docker compose build
docker compose up -d
docker compose exec nginx ps -ef
docker compose down

++++ ++++ this doesn't solve the console logging problem |

cat >Dockerfile <<EOR
FROM registry.access.redhat.com/ubi9/ubi-init
RUN cat <<'EOF' >/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!

++++

1)
anders als das Image aus https://hub.docker.com/_/debian ist dieses Image nicht reproduzierbar
2)
im Linuxhotel-Netzwerk lokalen Spiegelserver benutzen:
sudo debootstrap --variant=minbase trixie ./debian http://debian/debian
3)
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
4)
Wenn nicht:
docker container run --rm ingo/debian cat /etc/resolv.conf
→ Nameserver kommt von Docker, nicht aus dem Image Ändern mit:
docker container run --rm --dns 192.168.1.5 ingo/debian:local cat /etc/resolv.conf
docker container run --rm --dns 192.168.1.5 ingo/debian:local apt update
6)
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.
7)
falls apt update Spiegelserver im Linuxhotel-Netz nicht findet:
docker build --dns 192.168.1.5 -t='ingo/nginx:0.0.1' .
admin_grundlagen/docker/build.1791575008.txt.gz · Zuletzt geändert: (Externe Bearbeitung)