ARG 设置 ENV 无效的原因:ARG 的作用范围

Dockerfile 如下:

ARG BASE_IMAGE
ARG VARIABLE=test
FROM ${BASE_IMAGE}
ENV VARIABLE=$VARIABLE

但是在打包的镜像起的容器里 echo $VARIABLE 却是空。

原来是因为:

ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。

因此需要修改 Dockerfile 为:

ARG BASE_IMAGE
FROM ${BASE_IMAGE}
ARG VARIABLE=test
ENV VARIABLE=$VARIABLE

使用 docker run 打印环境变量

  • 正确方法:

    docker run -it --rm golang bash -c "echo \$VARIABLE"
    
  • 错误方法1

    这样会打印出本地的环境变量,而不是镜像的环境变量:

    export $VARIABLE=local
    docker run -it --rm golang echo $VARIABLE
    local
    

    可以通过 inspect 检查:

    docker inspect container_id
    

    可以看到

    "Env": [
        ...
        "VARIABLE=test"
    ],
    "Cmd": [
        "echo",
        "local"
    ],
    

    这里的 $VARIABLE 就不会被解析为变量,而是当作字符串。

  • 错误方法2
    这样会打印 $VARIABLE 字符串:

    docker run -it --rm golang echo \$VARIABLE
    $VARIABLE
    

    通过 inspect 检查,可以看到:

    "Env": [
        ...
        "VARIABLE=test"
    ],
    "Cmd": [
        "echo",
        "$VARIABLE"
    ],
    

    这里的 $VARIABLE 就不会被解析为变量,而是当作字符串。


┆凉┆暖┆降┆等┆幸┆我┆我┆里┆将┆ ┆可┆有┆谦┆戮┆那┆ ┆大┆始┆ ┆然┆
┆薄┆一┆临┆你┆的┆还┆没┆ ┆来┆ ┆是┆来┆逊┆没┆些┆ ┆雁┆终┆ ┆而┆
┆ ┆暖┆ ┆如┆地┆站┆有┆ ┆也┆ ┆我┆ ┆的┆有┆精┆ ┆也┆没┆ ┆你┆
┆ ┆这┆ ┆试┆方┆在┆逃┆ ┆会┆ ┆在┆ ┆清┆来┆准┆ ┆没┆有┆ ┆没┆
┆ ┆生┆ ┆探┆ ┆最┆避┆ ┆在┆ ┆这┆ ┆晨┆ ┆的┆ ┆有┆来┆ ┆有┆
┆ ┆之┆ ┆般┆ ┆不┆ ┆ ┆这┆ ┆里┆ ┆没┆ ┆杀┆ ┆来┆ ┆ ┆来┆