【问题标题】:Docker: Set export PATH in DockerfileDocker:在 Dockerfile 中设置导出路径
【发布时间】:2019-12-05 13:49:49
【问题描述】:

我必须设置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

似乎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.

【问题讨论】:

    标签: docker environment-variables dockerfile


    【解决方案1】:

    dockerfile中使用ENV指令

    ENV PATH "$PATH:/home/jovyan/.local/bin"
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      RUN pip install awscli
      # without --user
      

      但是如果一定要设置的话,需要使用DockerfileENV指令,并且需要指定绝对路径。 ($HOME does seem to be well-defined 但由于 Docker 容器通常不是多用户的,“主目录”通常不是一个概念。)

      ENV PATH="$HOME/.local/bin:$PATH"
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 2019-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多