将Docker映像环境变量公开给容器

时间:2019-09-05 15:15:45

标签: docker docker-compose environment-variables

我有一个使用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为空。

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

2 个答案:

答案 0 :(得分:0)

构建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和相应的Docker Compose build: {args: ...}是更好的匹配。

答案 1 :(得分:0)

尝试使用args代替env_file,这是一个很好的参考link,您的docker compose文件应类似于以下示例:

  version: '3'

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