在 Docker 中安装 Rust 工具链时,Bash `source` 命令不起作用

Jam*_*aix 16 linux bash docker

我正在尝试创建一个 docker 镜像,它将设置一个用于构建 Rust 项目的 Linux 环境。这是我Dockerfile到目前为止:

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 Code Online (Sandbox Code Playgroud)

我需要做的最后一件事是配置 Rust,以便我可以使用cargo. 文档说要使用

source $HOME/.cargo/env
Run Code Online (Sandbox Code Playgroud)

但是当我RUN在 Dockerfile中的命令中尝试时,它说source无法识别。我发现的另一个选择是使用

RUN /bin/bash -c "source ~/.cargo/env"
Run Code Online (Sandbox Code Playgroud)

这不会出错,但是当我运行我的容器时,cargo它不是一个可识别的命令。

当我打开容器时,这两种方法都适用于 Bash,但我希望将其作为图像的一部分自动执行。

如何将其集成到我的 Dockerfile 中?

mic*_*ard 25

您必须在 .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 Code Online (Sandbox Code Playgroud)

编辑

代替

RUN echo 'source $HOME/.cargo/env' >> $HOME/.bashrc

您可以使用

ENV PATH="/root/.cargo/bin:${PATH}"

这是一个较少的 bash-only 解决方案

  • 您可以使用 `ENV PATH="/root/.cargo/bin:${PATH}"`,这是使 `cargo` 可见的良好且透明的方式。PS 注意我的示例中的“/root”,您可以通过 dockerfile 中的“USER root”以 root 身份构建,也可以将“/root”更改为所需的目录。 (2认同)
  • `-s` 表示静默运行。`--` 用于将传递给 sh 的选项与后面的位置参数分开。`-y` - 是传递给 sh 执行的脚本的位置参数 - 这里是 rust 脚本。 (2认同)

fol*_*lex 7

唯一source ~/.cargo/env能做的就是

export PATH="$HOME/.cargo/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

所以我的建议是在你的 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
Run Code Online (Sandbox Code Playgroud)

这比 更透明source .cargo/env,如果您不熟悉 Rust,则更容易掌握。

另外,还要注意有生锈 的图像上DockerHub,你可以用它们(在FROM,而不是ubuntu:16.04运行或建造锈应用程序)。它比通过 apt 和 curl 安装所有东西更快更容易。

对于构建应用程序,您可能会发现多阶段 docker 构建很有用。它们非常灵活

  • 另一种选择是将 `ENV PATH="/root/.cargo/bin:${PATH}"` 替换为 `SHELL [ "/bin/sh", "-s", ".", "$HOME/. Cargo/env" ]` 将源代码添加到此后的每个命令中。 (3认同)