Die quell­of­fe­ne Software Docker hat sich als Standard für die Container-Vir­tua­li­sie­rung etabliert. Die Container-Vir­tua­li­sie­rung setzt die Ent­wick­lung der vir­tu­el­len Maschinen fort, jedoch mit einem be­deu­ten­den Un­ter­schied: anstatt ein kom­plet­tes Be­triebs­sys­tem zu si­mu­lie­ren, wird eine einzelne Ap­pli­ka­ti­on in einem Container vir­tua­li­siert. Heut­zu­ta­ge kommen Docker-Container in allen Phasen des Software-Lifecycle, wie Ent­wick­lung, Test und Betrieb, zum Einsatz.

Im Docker-Ökosystem exis­tie­ren ver­schie­de­ne Konzepte. Diese Be­stand­tei­le zu kennen und zu verstehen ist es­sen­zi­ell, um mit Docker ziel­füh­rend zu arbeiten. Dazu gehören ins­be­son­de­re das Docker-Image, der Docker-Container, sowie das Do­cker­file. Wir erklären die Hin­ter­grün­de und geben prak­ti­sche Tipps für den Einsatz.

Was ist ein Do­cker­file?

Das Do­cker­file ist die grund­le­gen­de Einheit im Docker-Ökosystem. Es be­schreibt die Schritte, welche zur Erzeugung eines Docker-Image führen. Der In­for­ma­ti­ons­fluss folgt dabei dem zentralen Schema: Do­cker­file > Docker-Image > Docker-Container

Ein Docker-Container hat eine begrenzte Le­bens­dau­er und in­ter­agiert mit seiner Umgebung. Sie können sich einen Container wie einen le­ben­di­gen Or­ga­nis­mus vor­stel­len. Denken Sie dabei an einen Einzeller, z. B. eine Hefezelle. Dieser Analogie folgend ent­spricht ein Docker-Image in etwa der Erb­infor­ma­ti­on: alle aus einem Image erzeugten Container sind gleich. Genau wie sämtliche aus einer Erb­infor­ma­ti­on geklonten Einzeller. Wie passt nun das Do­cker­file ins Schema?

Ein Do­cker­file definiert die Schritte zur Erzeugung eines neuen Images. Wichtig zu verstehen ist dabei, dass immer mit einem exis­tie­ren­den Basis-Image begonnen wird. Das neu erzeugte Image erbt vom Basis-Image. Hinzu kommen eine Reihe punk­tu­el­ler Än­de­run­gen. Auf unser He­fe­zel­len-Beispiel bezogen ent­spre­chen die Än­de­run­gen Mu­ta­tio­nen. Ein Do­cker­file legt für ein neues Docker-Image zwei Dinge fest:

  1. Das Basis-Image, von dem das neue Image abstammt. Hiermit wird das neue Image im Stammbaum des Docker-Öko­sys­tems verankert.
  2. Eine Reihe spe­zi­fi­scher Än­de­run­gen, welche das neue Image vom Basis-Image un­ter­schei­den.

Wie funk­tio­niert ein Do­cker­file und wie lässt sich daraus ein Image erzeugen?

Im Grunde genommen handelt es sich bei einem Do­cker­file um eine ganz normale Textdatei. Das Do­cker­file enthält eine Reihe von An­wei­sun­gen, welche jeweils auf einer eigenen Zeile stehen. Zur Erzeugung eines Docker-Image werden die An­wei­sun­gen hin­ter­ein­an­der aus­ge­führt. Dieses Schema ist Ihnen viel­leicht von der Aus­füh­rung eines Sta­pel­ver­ar­bei­tungs-Skriptes bekannt. Bei der Aus­füh­rung werden dem Image Schritt für Schritt weitere Layer hin­zu­ge­fügt. Wie das genau funk­tio­niert, erklären wir in unserem Artikel zum Thema Docker-Image.

Ein Docker-Image wird durch Ausführen der An­wei­sun­gen eines Do­cker­file erzeugt. Dieser Schritt wird als Build-Prozess be­zeich­net und wird mit Ausführen des „docker build“-Befehls gestartet. Ein zentrales Konzept ist der so­ge­nann­te Build-Context. Dieser definiert, auf welche Dateien und Ver­zeich­nis­se der Build-Prozess Zugriff hat. Dabei dient ein lokales Ver­zeich­nis als Quelle. Der Inhalt des Quell-Ver­zeich­nis­ses wird beim Aufruf von „docker build“ an den Docker-Daemon übergeben. Die in der Do­cker­file ent­hal­te­nen An­wei­sun­gen erhalten Zugriff auf die im Build-Kontext ent­hal­te­nen Dateien und Ver­zeich­nis­se.

Manchmal möchte man nicht alle im lokalen Quell-Ver­zeich­nis vor­lie­gen­den Dateien in den Build-Kontext aufnehmen. Für diese Fälle gibt es die .do­cke­ri­gno­re-Datei. Diese dient zum Aus­schlie­ßen von Dateien und Ver­zeich­nis­sen aus dem Build-Kontext. Der Name ist angelehnt an die .gitignore-Datei von Git. Der führende Punkt im Da­tei­na­men zeigt an, dass es sich um ver­steck­te Datei handelt.

Wie ist ein Do­cker­file aufgebaut?

Ein Do­cker­file ist eine Plain-Text-Datei mit Da­tei­na­men „Do­cker­file“. Beachten Sie, dass dabei die Groß­schrei­bung des ersten Buch­sta­ben zwingend vor­ge­schrie­ben ist. Die Datei enthält einen Eintrag pro Zeile. Wir zeigen hier den ge­ne­rel­len Aufbau eines Do­cker­file:

# Kommentar
ANWEISUNG Argumente

Neben Kom­men­ta­ren enthält das Do­cker­file An­wei­sun­gen und Argumente. Diese be­schrei­ben den Aufbau des Images.

Kom­men­ta­re und Parser-An­wei­sun­gen

Kom­men­ta­re enthalten primär für den Menschen gedachte In­for­ma­tio­nen. Wie bei­spiels­wei­se. aus den Pro­gram­mier­spra­chen Python, Perl und Ruby bekannt, beginnen Kom­men­ta­re in einem Do­cker­file mit einem Rau­te­zei­chen (#). Während des Build-Prozesses werden Kommentar-Zeilen vor der weiteren Ver­ar­bei­tung entfernt. Dabei gilt zu beachten, dass nur Zeilen, welche mit dem Raute-Zeichen beginnen als Kom­men­tar­zei­len erkannt werden.

Hier steht ein gültiger Kommentar:

# unser Base-Image
FROM busybox

Hingegen wird hier ein Fehler erzeugt, da das Rau­te­zei­chen nicht am Anfang der Zeile steht:

FROM busybox # unser Base-Image

Als Variante der Kom­men­ta­re gibt es die Parser-An­wei­sun­gen. Diese sind in Kommentar-Zeilen enthalten und müssen am Anfang des Do­cker­file stehen. Ansonsten werden sie als Kom­men­ta­re behandelt und beim Build entfernt. Ferner gilt zu beachten, dass eine bestimmte Parser-Anweisung nur ein einziges Mal pro Do­cker­file verwendet werden kann.

Zum Zeitpunkt der Ar­ti­kel­er­stel­lung exis­tie­ren lediglich zwei Arten von Parser-An­wei­sun­gen: „syntax“ und „escape“. Die Parser-Anweisung „escape“ definiert das zum Einsatz kommende Escape-Symbol. Dieses wird genutzt, um Anweisung über mehrere Zeilen zu schreiben, sowie Son­der­zei­chen aus­zu­drü­cken. Die „syntax“-Parser-Anweisung legt fest, nach welchen Regeln der Parser die Do­cker­file-An­wei­sun­gen zu ver­ar­bei­ten hat. Hier ein Beispiel:

# syntax=docker/dockerfile:1
# escape=\

An­wei­sun­gen, Argumente und Variablen

Die An­wei­sun­gen bilden den Hauptteil des Do­cker­file-Inhalts. Nach­ein­an­der aus­ge­führt be­schrei­ben die An­wei­sun­gen den spe­zi­fi­schen Aufbau eines Docker-Image. Ähnlich wie Befehle auf der Kom­man­do­zei­le nehmen die An­wei­sun­gen Argumente entgegen. Manche An­wei­sun­gen sind direkt mit spe­zi­fi­schen Kom­man­do­zei­len-Befehlen ver­gleich­bar. So existiert eine COPY-Anweisung, welche Dateien und Ver­zeich­nis­se kopiert und in etwa dem cp -Befehl auf der Kom­man­do­zei­le ent­spricht. Anders als auf der Kom­man­do­zei­le gibt es für manche der Do­cker­file-An­wei­sun­gen spe­zi­fi­sche Regeln für deren Abfolge. Ferner können bestimmte An­wei­sun­gen nur einmal pro Do­cker­file auftreten.

Hinweis

Die Groß­schrei­bung der An­wei­sun­gen ist nicht zwingend vor­ge­schrie­ben. Sie sollten der Kon­ven­ti­on dennoch folgen, wenn Sie ein Do­cker­file erstellen.

Bei den Ar­gu­men­ten gilt es zu un­ter­schei­den zwischen fest-kodierten und variablen Teilen. Der „12-factor App“-Me­tho­do­lo­gie folgend, verwendet Docker Um­ge­bungs­va­ria­blen zur Kon­fi­gu­ra­ti­on der Container. Innerhalb einer Do­cker­file werden Um­ge­bungs­va­ria­blen mit der ENV-Anweisung definiert. So weist man der Um­ge­bungs­va­ria­ble einen Wert zu.

Die in Um­ge­bungs­va­ria­blen ge­spei­cher­ten Werte lassen sich auslesen und als variable Teile von Ar­gu­men­ten nutzen. Dazu kommt eine spezielle Syntax zum Einsatz, welche an Shell-Skripte erinnert. Der Name der Um­ge­bungs­va­ria­ble wird mit einem Dol­lar­zei­chen versehen: $env_var. Ferner existiert eine al­ter­na­ti­ve Schreib­wei­se zum ex­pli­zi­ten Begrenzen des Va­ria­blen­na­mens. Hierbei wird der Va­ria­blen­na­me in ge­schweif­te Klammern ein­ge­bet­tet: ${env_var}. Schauen wir uns ein konkretes Beispiel an:

# Variable 'user' auf Wert 'admin' setzen
ENV user="admin"
# Nutzername auf 'admin_user' setzen
USER ${user}_user

Die wich­tigs­ten Do­cker­file-An­wei­sun­gen

Wir stellen hier die wich­tigs­ten Do­cker­file-An­wei­sun­gen vor. Tra­di­tio­nell durften manche An­wei­sun­gen — ins­be­son­de­re FROM — nur einmal pro Do­cker­file auftreten. Mitt­ler­wei­le gibt es Multi-Stage Builds. Diese be­schrei­ben mehrere Images in einer Do­cker­file. Die Ein­schrän­kung bezieht sich dann auf jede einzelne Build-Stage.

Anweisung Be­schrei­bung Kommentar
FROM Basis-Image festlegen Muss als erste Anweisung auftreten; nur ein Eintrag pro Build-Stage
ENV Um­ge­bungs­va­ria­blen für Build-Prozess und Container-Laufzeit setzen
ARG Kom­man­do­zei­len-Parameter für Build-Prozess de­kla­rie­ren Darf vor FROM-Anweisung auftreten
WORKDIR Aktuelles Ver­zeich­nis wechseln
USER Nutzer und Grup­pen­zu­ge­hö­rig­keit wechseln
COPY Dateien und Ver­zeich­nis­se in das Image kopieren Legt neuen Layer an
ADD Dateien und Ver­zeich­nis­se in das Image kopieren Legt neuen Layer an; von Nutzung wird abgeraten
RUN Befehl im Image während des Build-Prozesses ausführen Legt neuen Layer an
CMD Standard-Argumente für Container-Start festlegen Nur ein Eintrag pro Build-Stage
ENT­RY­PO­INT Standard-Befehl für Container-Start festlegen Nur ein Eintrag pro Build-Stage
EXPOSE Port-Zu­wei­sun­gen für laufenden Container de­fi­nie­ren Ports müssen beim Starten des Con­tai­ners aktiv ge­schal­tet werden
VOLUME Ver­zeich­nis im Image beim Start des Con­tai­ners im Host-System als Volumen einbinden

FROM-Anweisung

Die From-Anweisung legt das Basis-Image fest, auf dem die nach­fol­gen­den An­wei­sun­gen operieren. Diese Anweisung darf pro Build-Stage nur einmal vorhanden sein und muss als erste Anweisung auftreten. Dabei gibt es eine Ein­schrän­kung: die ARG-Anweisung darf vor der FROM-Anweisung auftreten. So ist es möglich, beim Starten des Build-Prozesses per Kom­man­do­zei­len­ar­gu­ment fest­zu­le­gen, welches Image genau als Basis-Image verwendet wird.

Jedem Docker-Image muss ein Basis-Image zugrunde liegen. Anders aus­ge­drückt: jedes Docker-Image hat genau ein Vorgänger-Image. Es ergibt sich ein klas­si­sches „Henne-Ei-Problem“: Irgendwo muss die Ab­stam­mungs­ket­te ihren Anfang haben. Im Docker-Universum beginnt die Ab­stam­mung mit dem „scratch“-Image. Dieses minimale Image dient als Ursprung eines jeden Docker-Images.

Hinweis

Auf Englisch bedeutet „from scratch“, dass etwas aus Grund­zu­ta­ten her­ge­stellt wird. Der Begriff findet beim Backen und Kochen Ver­wen­dung. Beginnt ein Do­cker­file mit der Zeile „FROM scratch“ wird also darauf an­ge­spielt, dass das Image von Grund auf neu zu­sam­men­ge­stellt wird.

ENV- und ARG-An­wei­sun­gen

Diese beiden An­wei­sun­gen weisen einer Variablen einen Wert zu. Die Un­ter­schei­dung zwischen beiden An­wei­sun­gen liegt primär darin, woher die Werte stammen und in welchem Kontext die Variablen verfügbar sind. Be­trach­ten wir zunächst die ARG-Anweisung.

Mit der ARG-Anweisung wird innerhalb des Do­cker­file eine Variable de­kla­riert, welche aus­schließ­lich für die Dauer des Build-Prozesses verfügbar ist. Der Wert einer mit ARG de­kla­rier­ten Variable wird beim Starten des Build-Prozesses als Kom­man­do­zei­len-Argument übergeben. Hier ein Beispiel; wir de­kla­rie­ren die Build-Variable „user“:

ARG user

Beim Starten des Build-Prozesses übergeben wir den ei­gent­li­chen Wert der Variable:

docker build --build-arg user=admin

Bei der De­kla­ra­ti­on der Variable kann optional ein Default-Wert fest­ge­legt werden. Wird beim Starten des Build-Prozesses kein passendes Argument übergeben, wird die Variable mit dem Default-Wert versehen:

ARG user=tester

Ohne Nutzung von „--build-arg“ enthält die Variable „user“ den Default-Wert „tester“:

docker build

Mithilfe der ENV-Anweisung de­fi­nie­ren wir eine Um­ge­bungs­va­ria­ble. Im Gegensatz zur ARG-Anweisung existiert eine mit ENV de­fi­nier­te Variable sowohl während des Build-Prozesses als auch während der Container-Laufzeit. Für die ENV-Anweisung gibt es zwei erlaubte Schreib­wei­sen.

  1. Emp­foh­le­ne Schreib­wei­se:
ENV version="1.0"
  1. Al­ter­na­ti­ve Schreib­wei­se, für Rückwärts-Kom­pa­ti­bi­li­tät:
ENV version 1.0
Tipp

Die Funk­tio­na­li­tät der ENV-Anweisung ent­spricht grob der des „export“-Befehls auf der Kom­man­do­zei­le.

WORKDIR- und USER-An­wei­sun­gen

Die WORKDIR-Anweisung dient zum Wechseln der Ver­zeich­nis­se während des Build-Prozesses, sowie beim Starten des Con­tai­ners. Der Aufruf von WORKDIR gilt für alle nach­fol­gen­den An­wei­sun­gen. Während des Build-Prozesses werden RUN-, COPY- und ADD-An­wei­sun­gen be­ein­flusst; während der Container-Laufzeit CMD- und ENT­RY­PO­INT-An­wei­sun­gen.

Tipp

Die WORKDIR-Anweisung ent­spricht in etwa dem Befehl cd auf der Kom­man­do­zei­le.

Analog zum Wechseln des Ver­zeich­nis­ses erlaubt die USER-Anweisung das Wechseln des aktuellen (Linux)-Nutzers. Optional lässt sich die Grup­pen­zu­ge­hö­rig­keit des Nutzers festlegen. Der Aufruf von USER gilt für alle nach­fol­gen­den An­wei­sun­gen. Während des Build-Prozesses werden RUN-An­wei­sun­gen durch Nutzer und Grup­pen­zu­ge­hö­rig­keit be­ein­flusst; während der Container-Laufzeit gilt dies für CMD- und ENT­RY­PO­INT-An­wei­sun­gen.

Tipp

Die USER-Anweisung ent­spricht in etwa dem Befehl su auf der Kom­man­do­zei­le.

COPY- und ADD-An­wei­sun­gen

Die COPY- und ADD-An­wei­sun­gen dienen beide dazu, dem Docker-Image Dateien und Ver­zeich­nis­se hin­zu­zu­fü­gen. Beide An­wei­sun­gen erzeugen einen neuen Layer, welcher auf das be­stehen­de Image gestapelt wird. Bei der COPY-Anweisung ist die Quelle immer der Build-Context. Im folgenden Beispiel kopieren wir eine Readme-Datei vom Un­ter­ver­zeich­nis „doc“ im Build-Context in das Top-Level-Ver­zeich­nis „app“ des Images:

COPY ./doc/readme.md /app/
Tipp

Die COPY-Anweisung ent­spricht in etwa dem Befehl cp auf der Kom­man­do­zei­le.

Die ADD-Anweisung verhält sich größ­ten­teils identisch, kann jedoch URL-Res­sour­cen außerhalb des Build-Kontexts abrufen und entpackt kom­pri­mier­te Dateien. In der Praxis führt dies unter Umständen zu un­er­war­te­ten Ne­ben­ef­fek­ten. Daher wird aus­drück­lich vom Gebrauch der ADD-Anweisung abgeraten. Sie sollten in den meisten Fällen aus­schließ­lich die COPY-Anweisung verwenden.

RUN-Anweisung

Bei der RUN-Anweisung handelt es sich um eine der am häu­figs­ten auf­tre­ten­den Do­cker­file-An­wei­sun­gen. Mit der RUN-Anweisung weisen wir Docker an, während des Build-Prozesses einen Kom­man­do­zei­len-Befehl aus­zu­füh­ren. Die dabei ent­ste­hen­den Än­de­run­gen werden als neuer Layer auf das be­stehen­de Image gestapelt. Für die RUN-Anweisung exis­tie­ren zwei Schreib­wei­sen:

  1. „Shell“-Schreib­wei­se: Die an RUN über­ge­be­nen Argumente werden in der Standard-Shell des Images aus­ge­führt. Dabei werden spezielle Symbole und Um­ge­bungs­va­ria­blen den Shell-Regeln folgend ersetzt. Hier ein Beispiel für einen Aufruf, welcher den aktuellen Nutzer begrüßt und dabei eine Subshell „$()“ verwendet:
RUN echo "Hello $(whoami)"
  1. „Exec“-Schreib­wei­se: Anstatt einen Befehl an die Shell zu übergeben, wird eine aus­führ­ba­re Datei direkt auf­ge­ru­fen. Dabei werden ggf. weitere Argumente übergeben. Hier ein Beispiel für einen Aufruf, welcher das Dev-Tool „npm“ aufruft und anweist, das Skript „build“ aus­zu­füh­ren:
CMD ["npm", "run", " build"]
Hinweis

Prin­zi­pi­ell lassen sich mit der RUN-Anweisung manche der anderen Docker-An­wei­sun­gen ersetzen. Bei­spiels­wei­se ist der Aufruf „RUN cd src“ ungefähr gleich­wer­tig zu „WORKDIR src“. Jedoch erzeugt dieser Ansatz Do­cker­files, welche sich bei wach­sen­dem Umfang schlech­ter Lesen und Verwalten lassen. Sie sollten daher nach Mög­lich­keit spe­zia­li­sier­te An­wei­sun­gen nutzen.

CMD- und ENT­RY­PO­INT-An­wei­sun­gen

Die RUN-Anweisung führt einen Befehl während des Build-Prozesses aus und legt dabei einen neuen Layer im Docker-Image an. Dem­ge­gen­über führt die CMD- bzw. ENT­RY­PO­INT-Anweisung einen Befehl beim Starten des Con­tai­ners aus. Der Un­ter­schied zwischen den beiden An­wei­sun­gen ist subtil:

  • ENT­RY­PO­INT wird genutzt, um einen Container zu erzeugen, welcher beim Starten immer dieselbe Aktion ausführt. Der Container verhält sich also wie eine aus­führ­ba­re Datei.
  • CMD wird genutzt, um einen Container zu erzeugen, welcher beim Starten ohne weitere Parameter eine de­fi­nier­te Aktion ausführt. Die vor­ein­ge­stell­te Aktion lässt sich durch geeignete Parameter leicht über­schrei­ben.

Gemeinsam haben beide An­wei­sun­gen, dass Sie nur ein einziges Mal pro Do­cker­file auftreten dürfen. Es ist jedoch möglich, beide An­wei­sun­gen zu kom­bi­nie­ren. In diesem Fall definiert ENT­RY­PO­INT die aus­zu­füh­ren­de Standard-Aktion beim Starten des Con­tai­ners, während CMD leicht zu über­schrei­ben­de Parameter für die Aktion definiert.

Unser Do­cker­file-Eintrag:

ENTRYPOINT ["echo", "Hello"]
CMD ["World"]

Die da­zu­ge­hö­ri­gen Befehle auf der Kom­man­do­zei­le:

# Ausgabe "Hello World"
docker run my_image
# Ausgabe "Hello Moon"
docker run my_image Moon

EXPOSE-Anweisung

Docker-Container kom­mu­ni­zie­ren über das Netzwerk. Im Container laufende Services werden über fest­ge­leg­te Ports an­ge­spro­chen. Die EXPOSE-Anweisung do­ku­men­tiert Port-Zu­wei­sun­gen und un­ter­stützt die Pro­to­kol­le TCP und UDP. Wird ein Container mit „docker run -P“ gestartet, lauscht der Container auf den per EXPOSE de­fi­nier­ten Ports. Al­ter­na­tiv lassen sich die zu­ge­wie­se­nen Ports mit „docker run -p“ über­schrei­ben.

Hier ein Beispiel. Unser Do­cker­file enthält die folgenden EXPOSE-An­wei­sun­gen:

EXPOSE 80/tcp
EXPOSE 80/udp

Dann bieten sich die folgenden Wege, die Ports beim Starten des Con­tai­ners aktiv zu schalten:

# Container lauscht für TCP- / UDP-Traffic auf Port 80
docker run -P
# Container lauscht für TCP-Traffic auf Port 81
docker run -p 81:81/tcp

VOLUME-Anweisung

Ein Do­cker­file definiert ein Docker-Image, welches aus über­ein­an­der ge­sta­pel­ten Layers besteht. Die Layers sind schreib­ge­schützt, so dass beim Starten eines Con­tai­ners immer derselbe Zustand ga­ran­tiert ist. Wir benötigen einen Me­cha­nis­mus, um Daten zwischen dem laufenden Container und dem Host-System aus­zu­tau­schen. Die VOLUME-Anweisung definiert einen „Mount Point“ innerhalb des Con­tai­ners.

Be­trach­ten wir den folgenden Aus­schnitt eines Do­cker­file. Wir legen ein Ver­zeich­nis „shared“ im Top-Level-Ver­zeich­nis des Images an. Ferner legen wir fest, dass dieses Ver­zeich­nis beim Start des Con­tai­ners im Host-System ein­ge­bun­den wird:

RUN mkdir /shared
VOLUME /shared

Beachten Sie, dass wir innerhalb der Do­cker­file nicht den ei­gent­li­chen Pfad auf dem Host-System festlegen können. Stan­dard­mä­ßig werden per VOLUME-Anweisung de­fi­nier­te Ver­zeich­nis­se auf dem Host-System unterhalb von „/var/lib/docker/volumes/“ ein­ge­bun­den.

Wie lässt sich ein Do­cker­file be­ar­bei­ten?

Zur Er­in­ne­rung: Bei einem Do­cker­file handelt es sich um eine (Plain)-Text-Datei. Diese lässt sich mit gängigen Methoden be­ar­bei­ten; am häu­figs­ten kommt wohl ein Plain-Text-Editor zum Einsatz. Dabei kann es sich um Editor mit gra­fi­scher Be­nut­zer­ober­flä­che handeln. An Optionen mangelt es hier nicht; zu den be­lieb­tes­ten Editoren zählen VSCode, Sublime Text, Atom und Notepad++. Al­ter­na­tiv stehen auf der Kom­man­do­zei­le eine Reihe von Editoren zur Verfügung. Neben den Ur­ge­stei­nen Vim bzw. Vi sind die minimalen Editoren Pico und Nano weit ver­brei­tet.

Hinweis

Sie sollten eine Plain-Text-Datei aus­schließ­lich mit dafür ge­eig­ne­ten Editoren be­ar­bei­ten. Kei­nes­falls sollten Sie zum Be­ar­bei­ten eines Do­cker­file einen Word-Prozessor wie Microsoft Word, Apple Pages oder Libre- bzw. Open­Of­fice verwenden.

Zum Hauptmenü