【问题标题】:Docker How to use environment variables in RUN command, not CMD?Docker如何在RUN命令中使用环境变量,而不是CMD?
【发布时间】:2022-01-09 21:23:17
【问题描述】:

我有:

docker-compose.yml

version: "3.9"
services:
    test_name:
        image: ${PROJECT_NAME}/test_service
        build:
            dockerfile: Dockerfile
    env_file: .env

Dockerfile

FROM alpine:3.15

RUN echo $TEST >> test1.txt
CMD echo $TEST >> test2.txt

结果:

test1.txt - 为空且带有数据的 test2.txt。

我的问题是这个变量太多了,所以我可以从.env文件中获取RUN命令中的环境变量,而不用在ARG中枚举它们吗?

【问题讨论】:

  • 我看到存在哪些步骤的方案:vsupalov.com/docker-env-vars。但是我还是不明白怎么用..
  • 在我的 Dockerfiles 中,我倾向于需要相当少的 ARGs,通常可能只需要一个基本映像的版本和一些构建元数据。是什么导致您拥有如此多的ARGs,以至于您无法管理它们?

标签: docker docker-compose environment-variables


【解决方案1】:

要在 RUN 指令中使用变量,您需要使用 ARG。 ARG 在构建时可用,而ENV 在容器运行时可用。

FROM alpine:3.15

ARG FOO="you see me on build"
ENV BAR="you see me on run"

RUN echo $FOO >> test1.txt
CMD echo $BAR >> test2.txt
docker build --build-arg FOO="hi" --tag test .
docker run --env BAR="there" test

有一件事接近于使用环境变量,但您仍然需要提供 --build-arg 标志。
您可以定义与构建 arg 同名的 env 变量,并通过其名称引用它而无需设置值。该值将取自 shell 中的 env 变量。

export FOO="bar"
docker build --build-arg FOO --tag test .

这也适用于撰写。

此外,当您使用 compose 时,您可以在 compose 文件旁边放置一个 .env 文件。在那里找到的变量将被读取并在 build:arg 键和环境键中可用,但您仍然必须命名它们。

# env file
FOO=bar
BAZ=qux
services:
  test_name:
      build:
        context: ./
        args:
          FOO:
          BAZ:

【讨论】:

  • 我可以从 .env 文件中获取变量而不在 ARG 中枚举所有变量吗?我的问题是这个变量太多了。
  • 不,你不能使用 env 文件来构建参数,afaik。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 2015-09-21
  • 2022-08-16
  • 2016-09-08
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2018-04-29
相关资源
最近更新 更多