395 Stimmen

Wie erstellt man ein Dockerfile aus einem Image?

Ist es möglich, ein Dockerfile aus einem Image zu generieren? Ich möchte dies aus zwei Gründen wissen:

  1. Ich kann Bilder aus dem Repository herunterladen, möchte aber das Rezept sehen, das sie generiert hat.

  2. Ich mag die Idee, Snapshots zu speichern, aber wenn ich fertig bin, wäre es schön, ein strukturiertes Format zu haben, um zu überprüfen, was getan wurde.

17voto

Kharthigeyan Punkte 565

Wenn Sie an einem Bild interessiert sind, das im Docker-Hub-Register vorhanden ist und den Dockerfile ansehen möchten?

Beispiel:

Wenn Sie den Dockerfile des Bildes "jupyter/datascience-notebook" sehen möchten, geben Sie das Wort "Dockerfile" in die Adressleiste Ihres Browsers ein, wie unten gezeigt.

https://hub.docker.com/r/jupyter/datascience-notebook/ Bildbeschreibung hier eingeben

https://hub.docker.com/r/jupyter/datascience-notebook/Dockerfile

Bildbeschreibung hier eingeben

Hinweis: Nicht alle Bilder haben ein Dockerfile, zum Beispiel https://hub.docker.com/r/redislabs/redisinsight/Dockerfile Manchmal ist dieser Weg viel schneller als das Suchen nach einem Dockerfile in Github.

13voto

Scott Centoni Punkte 847

Dies stammt aus @fallinos Antwort, mit einigen Anpassungen und Vereinfachungen durch Verwendung der Ausgabeformatoption für docker history. Da macOS und Gnu/Linux unterschiedliche Befehlszeilendienstprogramme haben, ist eine andere Version für Mac erforderlich. Wenn Sie nur eine oder die andere benötigen, können Sie einfach diese Zeilen verwenden.

#!/bin/bash
case "$OSTYPE" in
    linux*)
        docker history --no-trunc --format "{{.CreatedBy}}" $1 | # Informationen aus den Schichten extrahieren
        tac                                                    | # Datei umkehren
        sed 's,^\(|3.*\)\?/bin/\(ba\)\?sh -c,RUN,'             | # /bin/(ba)?sh Aufrufe zu RUN ändern
        sed 's,^RUN #(nop) *,,'                                | # RUN #(nop) Anrufe für ENV,LABEL... entfernen
        sed 's,  *&&  *, \\\n \&\& ,g'                           # mehrzeilige Befehlszeilen gemäß den Best Practices von Docker übersichtlich formatieren
    ;;
    darwin*)
        docker history --no-trunc --format "{{.CreatedBy}}" $1 | # Informationen aus den Schichten extrahieren
        tail -r                                                | # Datei umkehren
        sed -E 's,^(\|3.*)?/bin/(ba)?sh -c,RUN,'               | # /bin/(ba)?sh Aufrufe zu RUN ändern
        sed 's,^RUN #(nop) *,,'                                | # RUN #(nop) Anrufe für ENV,LABEL... entfernen
        sed $'s,  *&&  *, \\\ \\\n \&\& ,g'                      # mehrzeilige Befehlszeilen gemäß den Best Practices von Docker übersichtlich formatieren
    ;;
    *)
        echo "unbekannter OSTYPE: $OSTYPE"
    ;;
esac

12voto

jpetazzo Punkte 13872

Es ist im Moment nicht möglich (es sei denn, der Autor des Bildes hat das Dockerfile ausdrücklich eingeschlossen).

Aber es ist definitiv etwas Nützliches! Es gibt zwei Dinge, die bei der Implementierung dieses Features helfen werden.

  1. Vertrauenswürdige Builds (ausführlich diskutiert in dieser Diskussion im docker-dev Forum)
  2. Mehr detaillierte Metadaten in den aufeinanderfolgenden Bildern, die im Build-Prozess erstellt wurden. Langfristig sollten die Metadaten anzeigen, welcher Build-Befehl das Bild erstellt hat, was bedeutet, dass es möglich sein wird, das Dockerfile aus einer Sequenz von Bildern zu rekonstruieren.

12voto

user128364 Punkte 3963
docker pull chenzj/dfimage

alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm chenzj/dfimage"

dfimage image_id

Unten finden Sie die Ausgabe des Befehls dfimage:

$ dfimage 0f1947a021ce

FROM node:8
WORKDIR /usr/src/app

COPY file:e76d2e84545dedbe901b7b7b0c8d2c9733baa07cc821054efec48f623e29218c in ./
RUN /bin/sh -c npm install
COPY dir:a89a4894689a38cbf3895fdc0870878272bb9e09268149a87a6974a274b2184a in .

EXPOSE 8080
CMD ["npm" "start"]

0voto

linux.cnf Punkte 323

Es ist in nur zwei Schritten möglich. Ziehen Sie zuerst das Bild und führen Sie dann den Docker-Historie-Befehl aus. Außerdem in SS.

docker pull kalilinux/kali-rolling
docker history --format "{{.CreatedBy}}" kalilinux/kali-rolling --no-trunc

Geben Sie hier eine Bildbeschreibung ein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X