GNU/Linux >> Linux の 問題 >  >> Linux

Rust ツールチェーンを Docker にインストールすると、Bash の「source」コマンドが機能しません

ソースを .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番目が欲しいです。つまり、この環境がセットアップ目的でのみ必要であり、永続化したくない場合があります。これはまれですが、そのシナリオは何度か出てきました。


Linux
  1. `source`の後にコマンド名を入力するとオートコンプリートが機能しないのはなぜですか?

  2. 実行中のDockerコンテナでコマンドを実行する方法

  3. エイリアス コマンドを bash スクリプトまたは .bashrc ファイルで機能させる方法

  1. docker run へのコマンドライン引数

  2. jenkins パイプラインで bash コマンドを実行する

  3. Bash `(())` が `[[]]` 内で動作しないのはなぜですか?

  1. bashで編集するときにファイルを保存して閉じる方法は?

  2. Bash の正規表現の問題:[^negate] が機能しないようです

  3. 履歴に保存せずに bash でコマンドを実行する