GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bei der Installation der Rust-Toolchain in Docker funktioniert der Bash-Befehl „source“ nicht

Sie müssen das Sourcing innerhalb der .bashrc.

hinzufügen

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


Linux
  1. Warum funktioniert die automatische Vervollständigung nicht, wenn ein Befehlsname nach „Quelle“ eingegeben wird?

  2. Wie man den Alias-Befehl in einem Bash-Skript oder einer Bashrc-Datei zum Laufen bringt

  3. Warum funktioniert Bash `(())` nicht innerhalb von `[[]]`?

  4. Probleme mit regulären Ausdrücken in Bash:[^negate] scheint nicht zu funktionieren

  5. Führen Sie einen Befehl aus, wenn das System im Leerlauf ist und wenn es wieder aktiv ist

Bash-Wartebefehl

Bash-printf-Befehl

Die Docker-Installation unter Linux Mint 19.2 funktioniert nicht

Führen Sie einen Befehl kontinuierlich erneut aus, wenn er in Bash beendet ist

Wie speichere und schließe ich die Datei beim Bearbeiten in Bash?

Befehl in Bash ausführen, ohne im Verlauf zu speichern