Sie müssen das Sourcing innerhalb der .bashrc.
hinzufügenDas funktioniert:
FROM ubuntu:16.04
# Update default packages
RUN apt-get update
# Get Ubuntu packages
RUN apt-get install -y \
build-essential \
curl
# Update new packages
RUN apt-get update
# Get Rust
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
BEARBEITEN
Statt
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
Sie können
verwenden
ENV PATH="/root/.cargo/bin:${PATH}"
das ist eine weniger reine Bash-Lösung
Das einzige, was source ~/.cargo/env
tut ist
export PATH="$HOME/.cargo/bin:$PATH"
Mein Vorschlag ist also, PATH explizit in Ihrem Dockerfile zu setzen:
FROM ubuntu:16.04
# Update default packages
RUN apt-get -qq update
# Get Ubuntu packages
RUN apt-get install -y -q \
build-essential \
curl
# NOTE: no need to run update again at this point
# RUN apt-get update
# Get Rust; NOTE: using sh for better compatibility with other base images
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
# Add .cargo/bin to PATH
ENV PATH="/root/.cargo/bin:${PATH}"
# Check cargo is visible
RUN cargo --help
Dies ist etwas transparenter als source .cargo/env
, und leichter zu verstehen, wenn Sie mit Rust nicht vertraut sind.
Beachten Sie auch, dass es Rost-Images auf DockerHub gibt, Sie können sie verwenden (in FROM
, statt ubuntu:16.04
) zum Ausführen oder Erstellen von Rust-Apps. Es wird schneller und einfacher sein, als alles über apt und curl zu installieren.
Für das Erstellen von Apps besteht die Möglichkeit, dass Sie mehrstufige Docker-Builds nützlich finden. Sie sind ziemlich flexibel.
Ich glaube, Sie missverstehen was source
ist tut. Dieser eingebaute Befehl weist die aktuelle Shell an, den folgenden Code (fast) so zu laden, als ob er an der aktuellen Eingabeaufforderung ausgeführt würde (Sie können source auch in anderen Skripten verwenden). Es ist im Grunde ein Befehl "Datei hier einschließen". Es wird hauptsächlich verwendet, um Ihre Umgebung einzurichten (PATH, LIBPATH und andere Shell-Funktionen), nicht um echte Arbeit zu leisten.
Das Ausführen von "source" in einem RUN-Befehl ist daher (fast immer) nutzlos. Es wird die Frachtumgebung laden und dann verlassen, wodurch alle Umgebungsänderungen verloren gehen.
Dies lässt Ihnen zwei grundlegende Optionen. Einer ist, zu tun, was michael_bitard vorschlägt, und es zu Ihrem .bashrc
hinzuzufügen . Dies bedeutet, dass alle Befehle für immer in diesem Container (von diesem Benutzer) die Umgebung eingerichtet haben. Wenn Sie dies nur für die Einrichtung benötigen, verschmutzt es zur Laufzeit Ihre Shell-Umgebung.
Die zweite Option besteht darin, die Quelle grundsätzlich als Teil jedes RUN-Befehls auszuführen, der sie im Rest Ihres Dockerfile
benötigt . RUN bash -c 'source $HOME/.cargo/env; command goes here
zum Beispiel. Das ist mehr Arbeit für jede RUN-Zeile, aber die Umgebung wird explizit da sein, wenn Sie sie brauchen, und nicht, wenn Sie sie nicht brauchen.
Meistens , ist die erste Option, was Sie wollen. Selten du willst das zweite. Das heißt, manchmal benötigen Sie diese Umgebung nur für Einrichtungszwecke und möchten nicht, dass sie bestehen bleibt - das ist selten, obwohl ich dieses Szenario einige Male hatte.