Home Random

Docker

TL;DR#

Installation#

Install via apt: https://docs.docker.com/engine/install/debian/#install-using-the-repository Add user to Docker-Group: https://docs.docker.com/engine/install/linux-postinstall/

docker inspect#

Um Mehr Über das Image zu erfahren kann man mit

docker inspect <image:version>

jegliche Daten ausgegeben kriegen, die von vom Ersteller:in eingegeben wurden.

Entrypoint#

Möchte man das vorgegebene Verhalten, beim Starten des Containers, ändern, kann man den --entrypoint überschreiben. Dies kann hilfreich sein, wenn man sich bspw. nur das innere des Containers anschauen möchte ohne das irgendetwas gestartet wird.

Überschreiben mit der Bash-Shell würde wie folgt funktionieren:

docker run \
    --entrypoint /bin/bash \
    -it \
    <image:version>

Das -it ist nötig, um ein Exit(0) des Containers zu verhindern. Exit(0) würde passieren, wenn die Shell merkt, dass sich niemand verbindet.

Optimizing Image size#

Anstatt viele RUN-Kommandos zu verwenden, die jedes Mal einen neuen Layer aufmachen, bietet es sich an ein einziges RUN mit dem &&-Operator zu nehmen. Wenn du unschlüssige bist, warum der Container so riesige geworden ist, hilft ein

docker image history <img>

Damit wird die Größe der einzelnen Layer angezeigt.

Github Container Registry#

You need to give the docker-command the permissions to access the Github-Container-Registry (ghcr). You do this via a Personal access token. Find the option for this under https://github.com/settings/tokens. The token needs the following permissions:

docker login ghcr.io -u <USER> --password <TOKEN>
docker build . -t ghcr.io/user/repo:v0.1
docker push ghcr.io/user/repo:v0.1

You can now pull the image with

docker pull ghcr.io/user/repo:v0.1

More on this topic: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry

Troubleshooting#

Container stoppt langsam & gibt Exit Code 137#

Die Binary die im Container läuft hat das SIGKILL nicht erhalten und Docker wartet eine vordefinierte Zeit lang bis er den Container runterfährt. Dabei wird die Binary (bzw. das Programm) nicht ordentlich geschlossen. Die Binary erhält das SIGKILL nicht, da sie nicht PID 1 ist. Das kann vorkommen, wenn man das Programm mit einem bash -c oder über CMD startet.

Abhilfe schafft ENTRYPOINT im JSON-Format:

ENTRYPOINT ["./binary", "-db", "mysqlite.db"]

Ob die Binary PID 1 ist, kann man testen in dem man im Container nachschaut (lol).

docker exec -it <container> ps aux