Docker:在 Dockerfile 中设置导出路径

Joe*_*der 6 environment-variables docker dockerfile

我必须设置export PATH=~/.local/bin:$PATH. 只要我docker exec -it <container> bash手动完成它就可以了。但是,我尝试将其自动化.dockerfile

FROM jupyter/scipy-notebook
RUN conda install --yes -c conda-forge fbprophet
ENV PATH="~/.local/bin:${PATH}"
RUN pip install awscli --upgrade --user
Run Code Online (Sandbox Code Playgroud)

似乎ENV PATH="~/.local/bin:${PATH}"与我在这里收到的警告的效果不同。你看到我做错了什么了吗?

WARNING: The scripts pyrsa-decrypt, pyrsa-decrypt-bigfile, pyrsa-encrypt, pyrsa-encrypt-bigfile, pyrsa-keygen, pyrsa-priv2pub, pyrsa-sign and pyrsa-verify are installed in '/home/jovyan/.local/bin' which is not on PATH.
Run Code Online (Sandbox Code Playgroud)

Dav*_*aze 10

$PATH是实际目录的列表,例如, /bin:/usr/bin:/usr/local/bin:/home/dmaze/bin。当你阅读时,不会发生扩展$PATH;如果它包含~/bin,它会查找名为 的目录~,就像您使用 shell 命令创建的目录一样mkdir \~

$PATH当您在 shell 中设置时PATH="~/bin:$PATH",首先您的本地 shell 会扩展~到您的主目录,然后设置环境变量。 Docker 不会扩展~为任何内容,因此您最终会得到一个$PATH包含文字的变量~

这里的最佳实践实际上是$PATH完全避免需要设置。Docker 镜像是一个独立的文件系统空间,因此您可以将东西安装到“系统”目录中,而不必担心混淆包管理器维护的东西或其他用户安装的东西;这Dockerfile是唯一可以安装任何东西的东西。

RUN pip install awscli
# without --user
Run Code Online (Sandbox Code Playgroud)

但如果必须设置,则需要使用 DockerfileENV指令,并且需要指定绝对路径。($HOME似乎确实定义良好,但由于 Docker 容器通常不是多用户的,因此“主目录”通常不是一个概念。)

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

(在 Dockerfile 中,Docker 将替换 $VARIABLE${VARIABLE}${VARIABLE:-default}和,但它不会执行任何其他 shell 扩展;不支持 的${VARIABLE:+isset}路径扩展,但支持 的变量扩展。)~$HOME


mch*_*wre 8

在中使用ENV指令dockerfile

ENV PATH "$PATH:/home/jovyan/.local/bin"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。