Contents
Warum?
Docker bietet über https://hub.docker.com jede Menge „offizielle“ Repositorien an. In meinen Blogbeitrag hab ich gezeigt wie man ein bestehendes Image nutzen, oder durch Verändern des Dockerfiles ein eigenes Image erstellen kann. Dieses nutzt aber immer noch das offizielle Alpine Image.
Manchmal, seien es IT-Policies oder technische Gründe, will man wirklich von Grund auf (from the scratch) beginnen.
Oder es regnet einfach den ganzen Tag so wie heute.
Los gehts
Hier mal ein simpler Workflow mit dem derzeitigen Debian testing aka stretch
#Standard Image
debootstrap stretch stretchdir > /dev/null
#Oder besser ein wirklich minimales Image
debootstrap --variant=minbase stretch stretchdir > /dev/null
Testen des Baseimages mittels chroot
chroot stretch
#austeigen mittels exit
Image erstellen simpel
Erstellen eines Images und ausführen eines Befehls innerhalb des Containers.
Der Container wird danach beendet, Image bleibt bestehen
tar -C stretchdir -c . | docker import - stretch
~# docker run stretch cat /etc/debian_version
9.0
~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85affea9f7a3 stretch "cat /etc/debian_v..." 6 seconds ago Exited (0) 5 seconds ago elated_pare
Image erstellen über ein Dockerfile
~# mkdir stretch-scratch
~# tar -C stretchdir . -czf stretch-scratch/rootfs.tgz
~# cd stretch-scratch/
~/stretch-scratch# ls -l
insgesamt 259228
-rw-r--r-- 1 root root 639 Mai 3 11:53 Dockerfile
-rw-r--r-- 1 root root 265441280 Mai 2 20:39 rootfs.tar
-rw-r--r-- 1 root root 44 Mai 3 11:57 supervisord.conf
Der inhalt des Dockerfiles
~/stretch-scratch# cat Dockerfile
FROM scratch
LABEL org.label-schema.vendor="migae21" \
org.label-schema.build-date="$BUILD_DATE" \
org.label-schema.name="minimal base images with Debian" \
org.label-schema.vcs-type="git" \
org.label-schema.vcs-url="https://github.com/migae21/strech-scratch" \
org.label-schema.schema-version="1.0rc1" \
operatingsystem="linux" \
kernelversion="4.9.0" \
arch="amd64"
ADD rootfs.tgz /
RUN apt-get update && \
apt-get -yq install supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
CMD ["/usr/bin/supervisord", "-n"]
~/stretch-scratch# cat supervisord.conf
[supervisord]
nodaemon=true
loglevel=debug
Build & Start
docker build . -t stretch
docker run -ti stretch --name stretch
Also jetzt warum das Ganze?
Es geht hier keinesfalls darum das Rad neu zu erfinden, oder dem kiss Prinzip untreu zu werden.
Vielmehr ist es ein Ausgangspunkt für weitere Artikel über Docker, die einige beachtenswerte Besonderheiten der Container aufzeigen. Als Beispiele seien mal folgende Diskussionsstränge genannt:
https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/#comment-1745
http://phusion.github.io/baseimage-docker/
Linkliste
http://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
https://ericchiang.github.io/post/containers-from-scratch/
Moby (toolset for building dist/images)
https://github.com/moby/moby
Debian images build with moby
https://github.com/tianon/docker-brew-debian/