Zdroj musíte přidat do .bashrc.
Funguje to:
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
UPRAVIT
Místo
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
můžete použít
ENV PATH="/root/.cargo/bin:${PATH}"
což je méně bash-only řešení
Jediná věc je source ~/.cargo/env
dělá je
export PATH="$HOME/.cargo/bin:$PATH"
Takže můj návrh je nastavit PATH explicitně ve vašem 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
Toto je o něco transparentnější než source .cargo/env
a snáze uchopitelný, pokud neznáte Rust.
Všimněte si také, že na DockerHubu jsou obrázky rzi, můžete je použít (v FROM
, namísto ubuntu:16.04
) pro spouštění nebo vytváření aplikací Rust. Bude to rychlejší a jednodušší než instalovat vše přes apt a curl.
Pro vytváření aplikací existuje možnost, že vám budou užitečné vícefázové dockery. Jsou docela flexibilní.
Myslím, že možná nerozumíte tomu, co source
dělá. Tento vestavěný příkaz říká aktuálnímu shellu, aby načetl následující kód (téměř), jako by byl spouštěn v aktuálním řádku (můžete také použít zdroj v jiných skriptech). Je to v podstatě příkaz "zahrnout sem soubor". Většinou se používá k nastavení vašeho prostředí (PATH, LIBPATH a další funkce shellu), nikoli k provádění skutečné práce.
Spouštění "zdroje" v příkazu RUN je tak (téměř vždy) k ničemu. Načte prostředí nákladu a poté odejde, čímž ztratí všechny změny prostředí.
Zbývají vám tak dvě základní možnosti. Jedním z nich je udělat, jak navrhuje michael_bitard, a přidat to do svého .bashrc
. To bude znamenat, že všechny příkazy navždy v tomto kontejneru (tímto uživatelem) budou mít nastavené prostředí. Pokud to potřebujete pouze pro nastavení, znečišťuje to prostředí vašeho shellu za běhu.
Druhá možnost je v podstatě spustit zdroj jako součást každého příkazu RUN, který jej potřebuje ve zbytku vašeho Dockerfile
. RUN bash -c 'source $HOME/.cargo/env; command goes here
například. To je více práce na každé lince RUN, ale prostředí tam bude explicitně, když ho budete potřebovat, a ne když ho nepotřebujete.
Většinu času , první možnost je to, co chcete. Zřídka chceš to druhé. To znamená, že někdy toto prostředí potřebujete pouze pro účely nastavení a nechcete, aby přetrvávalo – to je vzácné, i když se mi tento scénář párkrát objevil.