我有一个使用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
为空。
如何确保在构建和运行阶段都可以使用特定变量?
答案 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