gpt4 book ai didi

dockerfile - 如何在 Dockerfile 中使用命令替换

转载 作者:行者123 更新时间:2023-12-04 01:50:35 27 4
gpt4 key购买 nike

在我的 Dockerfile 中,我需要使用命令替换来添加一些环境变量。我想设置

ENV PYTHONPATH /usr/local/$(python3 -c 'from distutils import sysconfig; print(sysconfig.get_python_lib())')

但它不起作用。结果是
foo@bar:~$ echo $PYTHONPATH
/usr/local/$(python3 -c from distutils import sysconfig; print(sysconfig.get_python_lib()))

怎么了?

最佳答案

什么地方出了错

您尝试的 $( ... ) command substitution 用于 Bash,而 Dockerfile 不是 Bash。所以 docker 不知道如何处理它,它只是 docker 的纯文本,docker 只是按原样喷出你写的内容。

推荐

为了避免将值硬编码到 Dockerfile 中,而是在构建期间将设置或自定义变量动态更改为 PYTHONPATH,也许 ARG ...--build-arg docker 功能可能最有用,与 ENV ... 结合使用以确保它持续存在。

在您的 Dockerfile 中:

ARG PYTHON_PATH_ARG

ENV PYTHONPATH ${PYTHON_PATH_ARG}

在您构建容器的 Bash 中:

python_path="/usr/local$(python3 -c 'from distutils import sysconfig; print(sysconfig.get_python_lib())')"

docker build --build-arg PYTHON_PATH_ARG=$python_path .

解释

根据文档, ARG :

The ARG instruction defines a variable that users can pass at build-time to the builder with the docker build command using the --build-arg <varname>=<value> flag.



所以,在 Bash 中,我们首先:
python_path="/usr/local$(python3 -c 'from distutils import sysconfig; print(sysconfig.get_python_lib())')"
  • $(...) Bash 命令替换用于动态组合 Python 路径值
  • 为清楚起见,此值临时存储在 Bash 变量 $python_path

  • docker build --build-arg PYTHON_PATH_ARG=$python_path .
  • Bash 变量 $python_path 值传递给 docker 的 --build-arg PYTHON_PATH_ARG

  • 在 Dockerfile 中:
    ARG PYTHON_PATH_ARG
  • 所以 PYTHON_PATH_ARG 存储来自 --build-arg PYTHON_PATH_ARG...
  • 的值
    ARG 变量不等同于 ENV 变量,所以我们不能仅仅做 ARG PYTHONPATH 并完成它。根据有关 Using arg variables 的文档:

    ARG variables are not persisted into the built image as ENV variables are.



    所以最后:
    ENV PYTHONPATH ${PYTHON_PATH_ARG}
  • 我们使用 Dockerfile 的 ${...} 约定来获取 PYTHON_PATH_ARG 的值,并保存到你原来命名的 PYTHONPATH 环境变量

  • 与原始代码的区别

    你最初写道:
    ENV PYTHONPATH /usr/local/$(python3 -c 'from distutils import sysconfig; print(sysconfig.get_python_lib())')

    我将 Python 寻路部分重写为 Bash 命令,并在我的机器上进行了测试:

    $ python_path="/usr/local/$(python3 -c 'from distutils import sysconfig; print(sysconfig.get_python_lib())')"

    $ echo $python_path
    /usr/local//usr/lib/python3/dist-packages

    请注意,有一个双正斜杠 ... local//usr ... ,不确定这是否会破坏您的任何内容,这取决于您在代码中的使用方式。

    相反,我将其更改为:

    $ python_path="/usr/local$(python3 -c 'from distutils import sysconfig; print(sysconfig.get_python_lib())')"

    结果:
    $ echo $python_path
    /usr/local/usr/lib/python3/dist-packages

    所以这个新代码将没有双正斜杠。

    关于dockerfile - 如何在 Dockerfile 中使用命令替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49418754/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com