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.