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?
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 Formatdocker
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
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: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:Oder eine Kombination der oben genannten