环境:
-
操作系统: Ubuntu (VM-0-9-ubuntu)
-
容器引擎: Docker / Docker Compose
-
应用: Java 应用 (lvg-admin)
-
项目结构 :
text/docker/java/okai/lvg/ ├── docker-compose.yml ├── java_run.env <-- 环境变量文件(本次修改的目标) ├── lvg-admin.jar └── ...
问题描述:
在日常的容器运维中,修改配置文件(如 .env)后重启容器是一个常规操作。然而,有时候我们会遇到"明明修改了配置,重启容器后却依然运行着旧配置"的诡异现象,甚至伴随着命令行的报错。本文记录了一次生产环境中遇到的此类问题及其解决过程。
1. 初始需求:
运维过程中,需要更新 lvg-admin 容器的某个运行参数(Key),于是修改了项目目录下的环境变量文件 java_run.env。
2. 遇到的问题:
尝试使用标准命令重启容器以让配置生效:
bash
docker compose up -d --force-recreate lvg-admin
然而,容器重启后,应用日志显示其使用的 Key 依然是旧值,新配置并未生效。
3. 错误日志分析:
仔细观察执行上述命令时的控制台输出,发现存在严重的报错信息:
bash
WARN[0000] The "IMAGE_TAG" variable is not set. Defaulting to a blank string.
WARN[0000] ... the attribute `version` is obsolete ...
unable to get image 'lvg-admin:': Error response from daemon: invalid reference format

问题根源分析:
- 表面现象:环境变量修改未生效。
- 实际原因 :
docker-compose.yml中定义镜像时使用了变量(如image: lvg-admin:${IMAGE_TAG})。- 执行
docker compose up时未传入IMAGE_TAG。 - Docker 将
IMAGE_TAG解析为空字符串,导致镜像名变为非法的lvg-admin:。 - 关键点 :由于镜像名解析失败,Docker Compose 实际上并没有创建新容器 ,或者退出了执行流程。此时看到的"运行中"的容器,其实还是修改配置之前的旧容器 。自然,它读到的还是旧的
java_run.env配置。
解决方案:
为了让容器成功重建并读取到最新的 java_run.env,必须在启动命令中显式传递缺失的 IMAGE_TAG 变量,确保 Docker Compose 能够正确解析镜像并执行销毁重建的流程。
执行命令:
在命令行前加上变量定义(根据实际运行的镜像版本号,例如 v260116.01):
bash
IMAGE_TAG=v260116.01 docker compose up -d --force-recreate lvg-admin

验证步骤:
- 检查容器创建时间 :
执行docker ps | grep lvg-admin,确认CREATED状态为"几秒钟前"(Seconds ago),证明容器确实被重新创建了。 - 检查环境变量 :
执行docker inspect lvg-admin | grep 你的KEY,确认输出的值确实为修改后的新值。
总结:
在使用 Docker Compose 时,如果因为缺参导致报错,Compose 往往会中断更新操作。此时不要被"命令好像跑完了"的假象迷惑,务必检查报错日志。只有解决了报错(如补齐 IMAGE_TAG),--force-recreate 才能真正发挥作用,新挂载的配置文件才会生效。