Jak zbudować najmniejszy obraz dockera?

Napiszmy prosty programik w C, który po prostu wyświetli na ekran napis “Hello World!”.

#include<sys/syscall.h>

const char msg[] = "Hello World!\n";

void _start(){
  syscall(SYS_write, 1, msg, sizeof(msg) - 1);
  syscall(SYS_exit, 0);
}

Skompilujmy go używając gcc i optymalizacji rozmiaru.

# gcc -static -Os -nostartfiles -fno-asynchronous-unwind-tables hello-world.c -o hello-world

W następnym kroku zbudujmy obraz na podstawie poniższego pliku Dockerfile.

FROM scratch
ADD hello-world /
CMD ["/hello-world"]

Budujemy!

docker build -t hello-world .

I to wszystko. Mamy gotowy obraz z naszą aplikacją Hello World, który zajmuje tylko 1.84kB!

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              770ca6b8f31c        5 minutes ago       1.84kB

Na koniec spróbujmy go uruchomić.

$ docker run --rm hello-world 
Hello World!

Wczytanie hasła do skryptu bez wyświetlania na ekranie

Czy zastanawialiście się kiedyś jak wczytać hasło do zmiennej w skrypcie bez wyświetlania jej na ekranie?
Jest to dosyć proste zadanie i może być zapisane w zaledwie kilku linijkach:

oldSTTY=$(stty --save)
stty -echo
read -p "Password: " PASSWD; echo
stty $oldSTTY

1: Zapisujesz aktualny opcje terminala w zmiennej oldSTTY
2: Wyłączasz wyświetlanie wprowadzonych znaków na ekran
3: Wczytujesz hasło do zmiennej PASSWD
4: Przywracasz ustawienia terminala zapisane w zmiennej oldSTTY

Bardzo proste, prawda?