Docker compose 重复式变量

Docker compose duplicit variables

提问人:John Doe 提问时间:11/17/2023 更新时间:11/17/2023 访问量:34

问:

我的文件中的示例片段:

docker-compose.yaml:

 services:
  banana:
    container_name: banana
    hostname: banana
    build:
      context: ../..
      dockerfile: .devcontainer/pycharm/Dockerfile
      args:
        B_LOGIN: ${B_LOGIN}
        B_TOKEN: ${B_TOKEN}
        LOG_LEVEL: INFO
    environment:
      LOG_LEVEL: INFO
      PYTHONPATH: /workspace
    volumes:
      - ../..:/workspace:cached
    command: sleep infinity

Docke文件:

ARG B_LOGIN
ARG B_TOKEN
ARG LOG_LEVEL

RUN echo "${B_LOGIN}, ${B_TOKEN}, ${LOG_LEVEL}"

...

.env:

B_LOGIN="aaaa"
B_TOKEN="bbbb"

然后在我的应用程序中,我用来获取日志级别。os.getenv("LOG_LEVEL", "DEBUG")

如果我只在 中设置了我的变量,而在我的 中没有变量,则不会设置为 。 有没有办法设置一次,而不是在我的两个和里面?LOG_LEVELargs:environment:docker-compose.yamlLOG_LEVELINFOLOG_LEVELenvironment:args:docker-compose.yaml

我需要传递到我的 Dockerfile 并在我的应用程序中使用它。LOG_LEVEL

如果所有变量都可以在我的应用程序中不重复,然后在 Dockerfile 和我的应用程序中使用它们,我希望它。docker-compose.yaml

python docker-compose dockerfile

评论

0赞 STerliakov 11/17/2023
您可以将其放入 .env 以避免值重复,然后在 args 和 environment 部分中使用。您可以在 Dockerfile 中使用 ENV 指令来设置 envvar,而无需输入。LOG_LEVEL: $LOG_LEVELenvironment
0赞 John Doe 11/17/2023
因此,如果我希望在构建时和运行时使用var,我应该将其添加到build args:,然后添加到environment:或在Dockerfile ENV中设置?如果我希望能够在不再次运行 Docker compose 的情况下更改 var 怎么办?只有 ENV 会改变和 args: 不会改变吗?

答:

1赞 Hans Kilian 11/17/2023 #1

ARG 在构建时设置一个值。您可能希望在运行时设置变量,以便可以更改登录名和令牌值,而无需再次生成映像。

为此,请在 docker compose 文件中将变量定义为环境变量,如下所示

 services:
  banana:
    container_name: banana
    hostname: banana
    build:
      context: ../..
      dockerfile: .devcontainer/pycharm/Dockerfile
    environment:
      LOG_LEVEL: INFO
      PYTHONPATH: /workspace
      B_LOGIN: ${B_LOGIN}
      B_TOKEN: ${B_TOKEN}
      LOG_LEVEL: INFO
    volumes:
      - ../..:/workspace:cached
    command: sleep infinity

这些变量在生成时不可用,因此您不能使用 RUN 语句回显它们,因为该语句在生成时运行。但它们将在运行时可用于您的应用程序。

您无需在 Dockerfile 中定义环境变量,并且由于 RUN 语句不起作用,因此您可以删除问题中 Dockerfile 的 4 个语句。

评论

0赞 John Doe 11/17/2023
感谢您的回答!echo 命令只是一个例子。B_LOGIN和密码只需要一次即可获取库,所以我猜是构建时变量?我正在使用 log_level 为行为命令设置别名。我想我可以在 Dockerfile 以外的某个地方设置别名,但不知道在哪里。还需要在运行时使用它,因此更喜欢仅作为运行时 var。