GNU/Linux >> Linux Esercitazione >  >> Linux

Durante l'installazione della toolchain di Rust in Docker, il comando "source" di Bash non funziona

Devi aggiungere il sourcing all'interno del file .bashrc.

Funziona:

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

MODIFICA

Invece di

RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc

puoi usare

ENV PATH="/root/.cargo/bin:${PATH}"

che è una soluzione meno bash


L'unica cosa source ~/.cargo/env fa è

export PATH="$HOME/.cargo/bin:$PATH"

Quindi il mio suggerimento è di impostare PATH in modo esplicito nel tuo Dockerfile:

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

Questo è leggermente più trasparente di source .cargo/env e più facile da capire se non hai familiarità con Rust.

Inoltre, tieni presente che ci sono immagini ruggine su DockerHub, puoi usarle (in FROM , invece di ubuntu:16.04 ) per l'esecuzione o la creazione di app Rust. Sarà più veloce e più facile che installare tutto tramite apt e curl.

Per la creazione di app c'è la possibilità che troverai utili build docker multistadio. Sono piuttosto flessibili.


Penso che potresti fraintendere cosa source fa. Questo comando integrato dice alla shell corrente di caricare il seguente codice (quasi) come se fosse eseguito al prompt corrente (puoi anche usare source all'interno di altri script). È fondamentalmente un comando "includi file qui". Viene utilizzato principalmente per configurare il tuo ambiente (PATH, LIBPATH e altre funzioni della shell), non per svolgere un vero lavoro.

L'esecuzione di "source" in un comando RUN è quindi (quasi sempre) inutile. Caricherà l'ambiente del carico e quindi uscirà, perdendo così tutte le modifiche all'ambiente.

Questo ti lascia con due opzioni di base. Uno è fare come suggerisce michael_bitard e aggiungerlo al tuo .bashrc . Ciò significa che tutti i comandi per sempre in quel contenitore (da quell'utente) avranno l'ambiente impostato. Se ti serve solo per l'installazione, inquina il tuo ambiente shell in fase di esecuzione.

La seconda opzione è fondamentalmente eseguire il sorgente come parte di ogni comando RUN che ne ha bisogno nel resto del tuo Dockerfile . RUN bash -c 'source $HOME/.cargo/env; command goes here Per esempio. Questo richiede più lavoro su ogni riga RUN, ma l'ambiente sarà esplicitamente presente quando ne avrai bisogno e non quando non ne avrai bisogno.

Il più delle volte , la prima opzione è ciò che desideri. Raramente vuoi il secondo Cioè, a volte hai solo bisogno di questo ambiente per scopi di configurazione e non vuoi che persista:questo è raro, anche se ho avuto questo scenario alcune volte.


Linux
  1. [Risolto] bash:sudo:comando non trovato

  2. Perché il completamento automatico non funziona quando si digita un nome di comando dopo "source"?

  3. Come far funzionare il comando alias nello script bash o nel file bashrc

  4. argomenti della riga di comando per eseguire docker

  5. Perché Bash `(())` non funziona all'interno di `[[]]`?

Bash wait Comando

Comando Bash printf

Esegui il comando bash sulla pipeline jenkins

L'installazione di Docker su Linux Mint 19.2 non funziona

Riesegui continuamente un comando quando finisce in Bash

Esegui il comando in bash senza salvare nella cronologia