Moby: So lassen Sie Builder RUN / bin / bash anstelle von / bin / sh verwenden

Erstellt am 28. Juli 2014  ·  11Kommentare  ·  Quelle: moby/moby

Ich erstelle ein Dockerfile-Build-Skript und möchte Bash-Befehle verwenden. RUN verwendet standardmäßig / bin / sh. Gibt es eine Möglichkeit, RUN anzuweisen, stattdessen / bin / bash zu verwenden?

arebuilder kinquestion

Hilfreichster Kommentar

@ORESoftware Siehe obige Diskussion und https://github.com/moby/moby/pull/22489 , in dem die Dockerfile-Anweisung SHELL (Docker 1.12 und höher) hinzugefügt wurde.

  • Wenn Sie eine andere Shell für ein einzelnes RUN verwenden möchten, verwenden Sie die JSON-Notation (Exec Form) - wie oben erläutert:

    RUN ["/bin/bash", "-c", "echo I am now using bash!"]
    
  • Wenn Sie die Standard-Shell in Ihrem Image (und während des Builds) ändern möchten, verwenden Sie die Dockerfile-Anweisung SHELL , die in https://github.com/moby/moby/pull/22489 implementiert wurde:

    SHELL ["/bin/bash", "-c"]
    RUN echo I am now using bash!
    
  • Oder eine Kombination der oben genannten

    FROM ubuntu
    RUN echo I am using the default (/bin/sh)
    RUN ["/bin/bash", "-c", "echo I am using bash"]
    SHELL ["/bin/bash", "-c"]
    RUN echo I am using bash, which is now the default
    RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
    RUN ["echo", "I don't use a shell at all"]
    

Alle 11 Kommentare

Nein, dies ist fest auf "/ bin / sh -c" codiert.
Man könnte natürlich / bin / bash in einem vorherigen Build-Schritt mit / bin / sh verknüpfen.

Am Ende habe ich mein Dockerfile-Skript geändert, um eine Datei zu kopieren und diese zu verwenden, anstatt die Umleitung zu verwenden, die ich in bash verwendet hatte.

@dwatrous hast du versucht RUN ["echo", "hello"] wird nicht von /bin/sh IIRC verpackt. Wenn Sie also unbedingt Bash wollen, können Sie es aufrufen: RUN ["/bin/bash", "-c", "echo hello all in one string"] .
Lassen Sie uns wissen, ob es Ihr Problem löst.

bash kann manuell verwendet werden, indem es in RUN Anweisungen verwendet wird.

Es gibt keine Absicht oder keinen Plan, es möglich zu machen, es in Bash zu ändern.

Ich werde dies als Dokumentproblem markieren, da wir dies möglicherweise dokumentieren möchten. Es ist das dritte oder vierte Mal, dass diese Frage auftaucht.

Dies kann jetzt geschlossen werden aufgrund von: https://github.com/docker/docker/pull/7489

Also, was ist die Geschichte in diesem Fall?

@ORESoftware Siehe obige Diskussion und https://github.com/moby/moby/pull/22489 , in dem die Dockerfile-Anweisung SHELL (Docker 1.12 und höher) hinzugefügt wurde.

  • Wenn Sie eine andere Shell für ein einzelnes RUN verwenden möchten, verwenden Sie die JSON-Notation (Exec Form) - wie oben erläutert:

    RUN ["/bin/bash", "-c", "echo I am now using bash!"]
    
  • Wenn Sie die Standard-Shell in Ihrem Image (und während des Builds) ändern möchten, verwenden Sie die Dockerfile-Anweisung SHELL , die in https://github.com/moby/moby/pull/22489 implementiert wurde:

    SHELL ["/bin/bash", "-c"]
    RUN echo I am now using bash!
    
  • Oder eine Kombination der oben genannten

    FROM ubuntu
    RUN echo I am using the default (/bin/sh)
    RUN ["/bin/bash", "-c", "echo I am using bash"]
    SHELL ["/bin/bash", "-c"]
    RUN echo I am using bash, which is now the default
    RUN ["/bin/sh", "-c", "echo I am using /bin/sh"]
    RUN ["echo", "I don't use a shell at all"]
    

Ich weiß, dass ich zu spät zur Party komme und ja, das ist nicht die beste Lösung, aber es hat für das funktioniert, was ich brauchte

In meiner Docker-Datei führe ich nach dem Herunterladen und Extrahieren des SDK diese beiden Befehle aus

RUN cp / bin / bash / bin / sh
RUN echo "source ~ / google-cloud-sdk / path.bash.inc" >> ~ / .bashrc
RUN source ~ / .bashrc

Danach ist der Befehl gcloud während des Builds und zur Laufzeit verfügbar

Für diejenigen, die an strikter OCI-Reproduzierbarkeit interessiert sind, scheint der Dockerfile-Aufruf SHELL nicht in der OCIv1-Spezifikation gemäß Podman 1.4 enthalten zu sein:

SCHRITT 2: SHELL ["/ bin / bash", "-c"]
ERRO SHELL wird für das OCI-Bildformat nicht unterstützt, [/ bin / bash -c] wird ignoriert. Muss das Format docker verwenden

Update: Sieht so aus, als ob thaJeztah korrekt ist. Einige Diskussionen zur Unterstützung dieser Funktion finden Sie unter buildah: https://github.com/containers/buildah/issues/507

Update2: BUILDAH_FORMAT=docker zur Rettung

@qhaas glaubt nicht, dass dies mit OCI-Spezifikationen zu tun hat, sondern nur mit der Buildah-Implementierung

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen