【问题标题】:Docker build-arg doesn't automatically pick up env variable when defined in separate line在单独的行中定义时,Docker build-arg 不会自动获取 env 变量
【发布时间】:2020-04-19 03:30:36
【问题描述】:

鉴于此 Dockerfile:

ARG PY_VERSION

FROM python:${PY_VERSION}-buster

CMD python -V

这个docker build . --build-arg PY_VERSION=3.8
还有这个PY_VERSION=3.8 docker build . --build-arg PY_VERSION 工作。

但是这个

PY_VERSION=3.8
echo $PY_VERSION
3.8

docker build . --build-arg PY_VERSION

Sending build context to Docker daemon  2.048kB
Step 1/3 : ARG PY_VERSION
Step 2/3 : FROM python:${PY_VERSION}-buster
invalid reference format

如果环境变量没有设置在同一行,docker为什么不选择它?

版本:
Docker version 19.03.5, build 633a0ea
GNU bash, version 5.0.11(1)-release (x86_64-apple-darwin19.0.0)

编辑:
我知道我可以使用docker build . --build-arg PY_VERSION=$PY_VERSION,只是想知道为什么我提供的示例不起作用

【问题讨论】:

  • @Inian 这不起作用,那不等于docker build . --build-arg 3.8吗?
  • 在调用docker之前尝试export PY_VERSION
  • @Mafor 它适用于导出,这是为什么呢? docker build 是否在单独的 shell 中运行?
  • 没有export,shell只是设置了一个局部变量;它实际上不是环境变量,对 shell 启动的命令不可见。

标签: bash docker environment-variables


【解决方案1】:

在提供的示例中,您只是声明了PY_VERSION,但您没有为其分配值。

根据documentation

您也可以使用不带值的 --build-arg 标志,在这种情况下,来自本地环境的值将传播到正在构建的 Docker 容器中

内置的env 命令可用于显示可用的环境变量。

根据man page

如果没有按照环境规范指定命令名称,则打印生成的环境。这就像指定一个命令名'printenv'。

最后,要设置环境变量,必须使用内置的export 命令。

根据man page

提供的名称被标记为自动导出到随后执行的命令的环境中。

【讨论】:

  • 但是 docker 应该从 env 变量中自动选择它,请参阅问题的 cmets,它适用于 export
  • 没错,直到你export这个变量还没有在本地上下文中定义。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2021-05-24
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 1970-01-01
  • 2019-02-12
相关资源
最近更新 更多