ソースを .bashrc 内に追加する必要があります。
これは動作します:
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
編集
の代わりに
RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc
を使用できます
ENV PATH="/root/.cargo/bin:${PATH}"
これは bash のみのソリューションではありません
唯一のもの source ~/.cargo/env
export PATH="$HOME/.cargo/bin:$PATH"
したがって、Dockerfile で明示的に PATH を設定することをお勧めします:
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
これは source .cargo/env
よりもわずかに透過的です 、Rust に慣れていない場合でも簡単に把握できます。
また、DockerHub に錆のイメージがあることに注意してください。それらを使用できます (FROM
内)。 、ubuntu:16.04
の代わりに ) Rust アプリの実行またはビルド用。 apt と curl ですべてをインストールするよりも速くて簡単です。
アプリをビルドする場合、マルチステージ Docker ビルドが役立つ可能性があります。それらは非常に柔軟です。
source
を誤解しているかもしれません します。この組み込みコマンドは、現在のプロンプトで実行されているかのように (ほぼ) 次のコードをロードするように現在のシェルに指示します (他のスクリプト内で source を使用することもできます)。これは基本的に「ここにファイルを含める」コマンドです。これは主に、実際の作業ではなく、環境 (PATH、LIBPATH、およびその他のシェル関数) を設定するために使用されます。
したがって、RUN コマンドで「source」を実行しても (ほとんどの場合) 役に立ちません。貨物環境をロードしてから終了するため、すべての環境変更が失われます。
これにより、2 つの基本的なオプションが残ります。 1 つは、michael_bitard が提案するようにして、それを .bashrc
に追加することです。 .これは、そのコンテナー内の (そのユーザーによる) すべてのコマンドで環境が設定されることを意味します。これがセットアップにのみ必要な場合は、実行時にシェル環境が汚染されます。
2 番目のオプションは、基本的に Dockerfile
の残りの部分でソースを必要とするすべての RUN コマンドの一部としてソースを実行することです。 . RUN bash -c 'source $HOME/.cargo/env; command goes here
例えば。これは各 RUN 行での作業が増えますが、環境は、必要でないときではなく、必要なときに明示的に存在します。
ほとんどの場合 、最初のオプションはあなたが望むものです。 めったに あなたは2番目が欲しいです。つまり、この環境がセットアップ目的でのみ必要であり、永続化したくない場合があります。これはまれですが、そのシナリオは何度か出てきました。