首页 > 解决方案 > 将 Docker 映像环境变量公开给容器

问题描述

我有一个使用 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,env varApiUrl是空的。

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

标签: dockerdocker-composeenvironment-variables

解决方案


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

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

FROM alpine
ENV API_URL /
CMD printenv

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

docker-compose run tests_integration printenv

如果您确实需要在映像中硬编码该值,并且对于任何拥有映像副本的潜在用户来说,该值在所有环境中都很有用,则DockerfileARG和相应的Docker Composebuild: {args: ...}是更好的匹配.


推荐阅读