docker - 将 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
是空的。
如何确保特定变量在构建和运行阶段都可用?
解决方案
构建 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: ...}
是更好的匹配.
推荐阅读
- matlab - 从 ASCII 文件导入表
- java - 远程服务器上的肥皂调用速度较慢
- android - 上传Playstore免费和付费应用程序国家明智
- python - 将元组中的元素转换为类似字节的对象
- angular - 如何将 ngc 安装为项目特定的 cli 工具?
- logging - ELK Logstash 中的日期解析问题与日志的自定义 Java 时间戳格式
- c - 字符串与字符串文字:直接赋值还是 strcpy/strncpy?
- css - CSS - 选择文本元素
- batch-file - 在 Windows 10 的系统启动中放置 .bat 和 .vbs 脚本
- node.js - 如果 Node 设置为 staging,为什么 Rect .env 会提供 Production?