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?
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?
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 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.