GNU/Linux >> Znalost Linux >  >> Linux

Při instalaci Rust toolchain do Dockeru nefunguje příkaz Bash `source`

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.


Linux
  1. [Opraveno] bash:sudo:příkaz nenalezen

  2. Proč nefunguje automatické dokončování při zadávání názvu příkazu za „zdroj“?

  3. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  1. Jak spustit příkaz na spuštěném kontejneru Docker

  2. argumenty příkazového řádku pro spuštění dockeru

  3. Spusťte příkaz bash na jenkins pipeline

  1. Proč Bash `(())` nefunguje uvnitř `[[]]`?

  2. Průběžně znovu spouštějte příkaz, když skončí v Bash

  3. chroot selže - nelze spustit příkaz `/bin/bash':Žádný takový soubor nebo adresář