408 Stimmen

Change-Verzeichnis-Befehl in Docker?

In Docker möchte ich das tun:

git clone XYZ
cd XYZ
make XYZ

Aber da es keinen `cd` Befehl gibt, muss ich jedes Mal den vollständigen Pfad angeben (make XYZ /vollständigerPfad). Gibt es gute Lösungen dafür?

0voto

Beachten Sie, dass wenn Sie im bash-Shell laufen müssen, nicht nur das RUN make benötigen, sondern Sie die bash-Shell vorher aufrufen müssen, da Sie in Docker standardmäßig in der sh-Shell sind.

Entnommen aus /bin/sh: 1: gvm: not found, das mehr oder weniger sagen würde:

Ihre Shell ist /bin/sh, aber source erwartet /bin/bash, vielleicht weil es die Initialisierung in ~/.bashrc speichert.

Mit anderen Worten kann dieses Problem in allen Einstellungen auftreten, in denen die "sh"-Shell anstelle der "bash" verwendet wird, was zu "/bin/sh: 1: MY_COMMAND: not found" führt.

In dem Dockerfile-Fall verwenden Sie das empfohlene

RUN /bin/bash -c 'source /opt/ros/melodic/setup.bash'

oder mit den "[]" (die ich lieber nicht verwenden würde):

RUN ["/bin/bash", "-c", "source /opt/ros/melodic/setup.bash"]

Jedes neue Ausführen eines bash-Befehls ist isoliert, "beginnt bei 0". Beachten Sie zum Beispiel, dass das Festlegen von WORKDIR /MY_PROJECT vor den bash-Befehlen im Dockerfile die bash-Befehle nicht beeinflusst, da das Startverzeichnis erneut in der ".bashrc" festgelegt werden müsste. Sie benötigen cd /MY_PROJECT, auch wenn Sie WORKDIR festgelegt haben.

Anmerkung: Vergessen Sie nicht den ersten "/" vor "opt/../...". Andernfalls wird der Fehler ausgelöst:

/bin/bash: opt/ros/melodic/setup.bash: Datei oder Verzeichnis nicht gefunden

Funktioniert:

 => [stage-2 18/21] RUN ["/bin/bash", "-c", "source /opt/ros/melodic/setup.bash"]                                  0.5s
 => [stage-2 19/21] [...]

Siehe “/bin/sh: 1: MY_COMMAND: not found” auf SuperUser für einige weitere Details dazu, wie dies mit vielen Zeilen aussieht, oder wie Sie stattdessen die ".bashrc" ausfüllen würden. Aber das geht etwas über die eigentliche Frage hinaus.

PS: Sie könnten auch die Befehle, die Sie ausführen möchten, in ein einzelnes bash-Skript einfügen und dieses Bash-Skript im Dockerfile ausführen (obwohl ich die Bash-Befehle auch lieber im Dockerfile einfügen würde, nur meine Meinung):

#!/bin/bash
set -e

source /opt/ros/melodic/setup.bash

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