如何将参数从文件传递给 dockerfile

jor*_*vin 10 docker dockerfile

我正在尝试将参数从文件传递到 docker 文件。

我尝试将文件复制到 docker 容器中并使用 source 命令。

Dockerfile

COPY docker.env .
RUN /bin/bash -c "source docker.env"
Run Code Online (Sandbox Code Playgroud)

Docker.env

BuildMode="release"
Run Code Online (Sandbox Code Playgroud)

另一次尝试也没有成功

export BuildMode="release"
Run Code Online (Sandbox Code Playgroud)

没有错误,但是当我尝试打印时ECHO $BuildMode,它没有打印其中的值,就像它没有获取其中的值一样。

但是,如果我创建一个 docker 容器并在 docker 容器内尝试相同的代码,那么它就可以工作。

atl*_*ine 14

然后就可以使用了--build-arg,构建的时候会--build-arg key=value向dockerfile传递参数,参考这个

您只需要使用从 env 文件中获取并将它们组合为构建 dockerfile 时的sed格式,示例如下:--build-arg key=value

文档文件:

FROM ubuntu:16.04

ARG BuildMode
ENV BuildMode=${BuildMode}

RUN echo $BuildMode
Run Code Online (Sandbox Code Playgroud)

docker.env:

BuildMode="release"
Run Code Online (Sandbox Code Playgroud)

命令:

docker build -t abc:1 $(cat docker.env | sed 's@^@--build-arg @g' | paste -s -d " ") . --no-cache
Run Code Online (Sandbox Code Playgroud)

输出:

shubuntu1@shubuntu1:~/1$ docker build -t abc:1 $(cat docker.env | sed 's@^@--build-arg @g' | paste -s -d " ") . --no-cache
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM ubuntu:16.04
 ---> 13c9f1285025
Step 2/4 : ARG BuildMode
 ---> Running in 3bc49fbb0af4
Removing intermediate container 3bc49fbb0af4
Step 3/4 : ENV BuildMode=${BuildMode}
 ---> Running in 4c253fba0b36
Removing intermediate container 4c253fba0b36
 ---> c70f7f535d1f
Step 4/4 : RUN echo $BuildMode
 ---> Running in 5fef72f28975
"release"
Removing intermediate container 5fef72f28975
 ---> 4b5555223b5b
Successfully built 4b5555223b5b
Successfully tagged abc:1
Run Code Online (Sandbox Code Playgroud)

  • 在 mac os 12.6 上必须修改这部分 `$(cat docker.env | sed 's@^@--build-arg @g' | Paste -s -d " " /dev/stdin)` (2认同)

con*_*fiq 6

我遇到了空格和旧macOS bash version 3的问题。由于我必须为每个使用 macOS 的人工作,所以我必须采取变通办法并提出这个解决方案

while IFS= read -r line; do
  echo $line
  opts+=(--build-arg "$line")
done < ".ENV.FILE"

docker build "${opts[@]}" -t ${IMAGE_NAME}:${DTAG} -t ${IMAGE_NAME}:${K8S_NS} .
Run Code Online (Sandbox Code Playgroud)

哪里.ENV.FILE看起来像这样:

APP_PORT=3030
APP_HOST=0.0.0.0
APP_API_URL=FOO
APP_API_WHITE=S P A C E
Run Code Online (Sandbox Code Playgroud)

我希望它能帮助别人