【问题标题】:Expose Docker Image Environment Variables to Container将 Docker 映像环境变量公开给容器
【发布时间】:2019-09-05 15:15:45
【问题描述】:

我有一个使用 docker-compose 构建的 docker 镜像,并提供了一个环境文件,如下所示:

version: '3'
services:
  postgres:
    ...
  redis:
    image: redis:4.0
  api:
    build: ./src/api
    env_file: ./integrationtests.env
  tests_integration:
    build: ./tests/Integration
    env_file:
      - ./integrationtests.env
    depends_on:
      - postgres
      - redis
      - api

环境文件有几个定义,但我最关心的一个看起来像这样ApiUrl=http:\\api

我有一个用于集成测试的 docker 文件,定义如下:

FROM apline
WORKDIR /app

ENV ApiUrl $ApiUrl
COPY ./scripts ./scripts

ENTRYPOINT [ "printenv" ]

当我运行docker-compose up 时,它会正确打印出构建阶段可用的所有环境变量。但是当我做docker run --entrypoint printenv mycontainer 时,环境变量ApiUrl 是空的。

如何确保特定变量在构建和运行阶段都可用?

【问题讨论】:

    标签: docker docker-compose environment-variables


    【解决方案1】:

    构建 Docker 镜像在 Docker Compose 过程的早期发生; environment: 之类的设置对于在 Dockerfile 中运行的代码永远不可见(类似于网络设置和卷安装)。

    图像应该可以跨环境重复使用。我的建议是使环境变量的默认值尽可能通用,但希望它被覆盖。

    FROM alpine
    ENV API_URL /
    CMD printenv
    

    如果您想使用docker-compose.yml 中的环境和音量设置运行映像,您可以使用docker-compose run

    docker-compose run tests_integration printenv
    

    如果您确实需要在图像中硬编码该值,并且对于任何拥有图像副本的潜在用户而言,该值在所有环境中都很有用,Dockerfile ARG 和相应的@ 987654323@ 是更好的匹配。

    【讨论】:

      【解决方案2】:

      尝试使用 args 而不是 env_file 这是一个很好的参考 link 你的 docker compose 文件应该是这样的例子:

        version: '3'
      
          services:
            somename:
              build:
                context: ./app
                dockerfile: Dockerfile
                args:
                  some_variable_name: a_value
      

      【讨论】:

        猜你喜欢
        • 2015-09-18
        • 2022-01-16
        • 2021-06-07
        • 2020-02-23
        • 2015-08-10
        • 2016-12-08
        • 2021-06-25
        • 2017-09-18
        相关资源
        最近更新 更多