如何从Docker Compose中访问Shell环境变量?
实现Shell环境变量传递给Docker容器运行时(无需重新构建镜像)
你之前的问题出在用了构建阶段的build.args传递变量——这会触发镜像重新构建,而且根本不是运行时传递变量的正确方式。下面给你两种符合需求的实现方法:
方法一:修改docker-compose.yml配置运行时环境变量
直接在docker-compose.yml里用environment字段传递Shell中的环境变量,同时支持未指定变量时跑全部测试:
version: "3.6" services: app_test: build: context: .. dockerfile: Dockerfile # 传递Shell中的TEST_NAME,未设置则传空值 environment: - TEST_NAME=${TEST_NAME:-}
对应的Shell命令
# 指定单个测试用例运行 export TEST_NAME=test_widget_abc docker-compose -f docker-compose.yml -p myproject up --exit-code-from app_test # 运行全部测试(无需export变量,或执行unset TEST_NAME) docker-compose -f docker-compose.yml -p myproject up --exit-code-from app_test
Dockerfile无需修改
保留你原来的配置即可,容器启动时environment传递的变量会覆盖Dockerfile里的ENV值:
ENV TEST_NAME ${TEST_NAME} CMD python manage.py test $TEST_NAME
当TEST_NAME为空时,命令会自动变成python manage.py test,运行全部测试。
方法二:命令行临时传递变量(无需修改docker-compose.yml)
如果不想改动配置文件,也可以直接在docker-compose命令前临时设置变量:
# 指定测试用例 TEST_NAME=test_widget_abc docker-compose -f docker-compose.yml -p myproject up --exit-code-from app_test # 运行全部测试 docker-compose -f docker-compose.yml -p myproject up --exit-code-from app_test
这种方式不需要提前export变量,变量仅对当前docker-compose进程生效,同样能传递到容器的运行时环境中。
内容的提问来源于stack exchange,提问作者Cerin
相关产品推荐
相关产品推荐

