Eine qualitativ hochwertige Codebasis, auf die ein Entwickler stolz sein kann, kommt nicht ohne eine angemessene CI/CD-Pipeline aus. Linting, die Analyse Ihres Codes auf potenzielle Fehler und schlechte Codierungspraktiken, sollte ein Standardbestandteil Ihrer Pipeline sein. Vor allem interpretierte Sprachen wie Python profitieren stark vom Linting, da sie nicht kompiliert werden müssen. In diesem Blogbeitrag stelle ich einen Dockerfile-Linter namens Hadolint vor.
Linting Ihrer Dockerdatei
Genau wie Programmiersprachen können auch statische Dateien gelintet werden. Warum sollten Sie Ihre Dockerdatei lintieren? Sehen Sie sich Ihre eigene Dockerdatei online bei fromlatest.io an und überprüfen Sie sie auf mögliche Fehler. Es wird nach Optimierungen und wahrscheinlichen Fehlern gesucht, was zu einem saubereren Code, keinen Fehlern und möglicherweise einem kleineren Docker-Image führt. Es gibt mehrere Dockerfile-Linters, der beliebteste ist Hadolint, kurz für Haskell Dockerfile Linter.
Hadolint ist als Docker-Image verfügbar und Sie können damit lint:
docker run --rm -i hadolint/hadolint
Wenn Ihre Dockerdatei tadellos ist, sehen Sie keine Ausgabe und erhalten den Exit-Code 0. Wenn Ihre Dockerdatei Fehler wie diesen enthält:
1 # ===== Fehlerhaftes Dockerfile, nicht kopieren ===== 2 3 FROM continuumio/miniconda:latest 4 Führen Sie apt-get update aus 5 && apt-get install -y 6 gcc 7 Glücksfälle 8 Kuhstall 9 && pip install apache-airflow[crypto,postgres] 10 11 CMD /usr/games/fortune | /usr/games/cowsay
Diese Dockerdatei kann problemlos erstellt und ausgeführt werden:
$ docker build -t moo . $ docker run moo ________________________________ / Kein Problem ist unlösbar in allen denkbare Umstände. / -------------------------------- ^__^ (oo)_______ (__) )/ ||----w | || ||
Hadolint weist jedoch auf mehrere Fehler und potenzielle Probleme hin, die in Zukunft auftreten könnten, und gibt einen Exit-Code 1 zurück:
/dev/stdin:3 DL3007 Die Verwendung von latest ist fehleranfällig, wenn das Image jemals aktualisiert werden soll. Verknüpfen Sie die Version explizit mit einem Release-Tag /dev/stdin:4 SC2102 Ranges können nur mit einzelnen Zeichen übereinstimmen (aufgrund von Duplikaten). /dev/stdin:4 DL3008 Pin-Versionen in apt get install. Anstelle vonapt-get install <package>verwenden Sieapt-get install <package>=<version>/dev/stdin:4 DL3009 Löschen Sie die apt-get Listen, nachdem Sie etwas installiert haben /dev/stdin:4 DL3013 Pin-Versionen in pip. Anstelle vonpip install <package>verwenden Siepip install <package>==<version>/dev/stdin:4 DL3015 Vermeiden Sie zusätzliche Pakete durch die Angabe von--no-install-recommends/dev/stdin:11 DL3025 Argumente verwenden JSON-Notation für CMD- und ENTRYPOINT-Argumente
Jeder Fehler wird durch einen Schlüssel DL (Hadolint-Fehler) oder SC (ShellCheck-Fehler) dargestellt. Die Dokumentation für die häufigsten Fehler finden Sie im Hadolint-Wiki: github.com/hadolint/hadolint#rules.
Konfiguration
Eine schöne Funktion von Hadolint ist die Möglichkeit, die Konfiguration weiterzugeben. Der obige Fehler SC2102 bedeutet zum Beispiel, dass ShellCheck den Befehl pip install von Airflow mit zusätzlichen Paketen für einen Bereich hält, was in diesem Fall nicht zutrifft. Wir würden diesen Fehler also gerne ignorieren. Dafür gibt es 3 Möglichkeiten:
- Ignorieren Sie die gesamte Dockerdatei, indem Sie das Flag --ignore bei docker run übergeben:
docker run --rm -i hadolint/hadolint hadolint --ignore SC2102 -
- Ignorieren Sie die gesamte Dockerdatei, indem Sie die Konfigurations-Yaml-Datei einbinden:
.hadolint.yml:
ignoriert: - SC2102
docker run --rm -i -v ${PWD}/.hadolint.yml:/.hadolint.yaml hadolint/hadolint
- Ignorieren Sie bestimmte Anweisungen inline. Die Ausnahme gilt für eine komplette Dockerfile-Anweisung, einzelne Zeilen können nicht ausgeschlossen werden.
===== Fehlerhaftes Dockerfile, nicht kopieren ===== FROM continuumio/miniconda:latest # hadolint ignore=SC2102 RUN apt-get update && apt-get install -y gcc Vermögen cowsay && pip install apache-airflow[crypto,postgres] CMD /usr/games/fortune | /usr/games/cowsay
Integrieren Sie in Ihre CI-Pipeline
Um Änderungen an Ihren Dockerdateien kontinuierlich zu überprüfen, während Sie sie schreiben, integrieren Sie den Linter in Ihr CI. Linter-Fehler geben den Exit-Code 1 zurück und lassen Ihre Pipeline scheitern. Für Bitbucket Pipelines könnten Sie z.B. eine benutzerdefinierte "build-docker" Pipeline definieren:
benutzerdefinierte: bauen-Docker: - Schritt: Name: Dockerlint Skript: - Docker laufen --rm -i -v ${PWD}/.hadolint.yml:/.hadolint.yaml hadolint/hadolint:v1.10.3 Dockerdatei - Schritt: Name: Bauen Sie Bild Skript: - Docker bauen -t myimage .
Weitere Beispiele für die CI-Pipeline finden Sie in den Hadolint-Integrationsdokumenten.
Das war's mit dem Dockerfile-Linting, viel Spaß!
Unsere Ideen
Weitere Blogs
Contact



