如何检查Java Docker容器程序输出?求含sed的Java17镜像推荐
问题描述
我们有一个GitLab Pipeline作业,在预装Java的Docker容器中运行,配置如下:
generate_openapi_server_code: image: java:17 stage: validate tags: - test script: - "wget https://<artifactory-host-url>/artifactory/Maven-Central-remote-cache/org/openapitools/openapi-generator-cli/6.3.0/openapi-generator-cli-6.3.0.jar -O openapi-generator-cli.jar" - "java -jar openapi-generator-cli.jar generate -g spring -o out -i dispo.yaml | sed '/WARN/q1'"
作业第一步从Maven仓库下载Java库,随后启动程序。尝试用sed命令查看控制台输出时,因镜像未安装sed,作业失败并报错:sed: missing command。
需要解决两个问题:
- 如何在当前容器中检查Java程序的输出?
- 是否有内置Java 17和
sed等工具的更合适容器?
解决方案
一、在现有java:17镜像中检查输出的方法
1. 临时安装sed
java:17基于Debian/Ubuntu体系,可在script开头先安装sed:
script: - apt-get update && apt-get install -y sed - "wget https://<artifactory-host-url>/artifactory/Maven-Central-remote-cache/org/openapitools/openapi-generator-cli/6.3.0/openapi-generator-cli-6.3.0.jar -O openapi-generator-cli.jar" - "java -jar openapi-generator-cli.jar generate -g spring -o out -i dispo.yaml | sed '/WARN/q1'"
注意:安装步骤会增加作业运行时间,属于临时应急方案。
2. 无需sed的输出验证方式
如果只是为了验证程序运行结果,可跳过sed直接操作:
- 依赖退出码判断:Java程序执行成功通常返回0,失败返回非0,GitLab Pipeline会自动检测退出码,失败时标记作业异常。
- 直接输出全量日志:去掉管道逻辑,让程序输出直接显示在Pipeline日志中,方便完整查看:
- "java -jar openapi-generator-cli.jar generate -g spring -o out -i dispo.yaml"
二、推荐内置Java 17和常用工具的镜像
java:17是极简基础镜像,仅包含Java运行环境,缺少系统工具。推荐以下更实用的镜像:
1. eclipse-temurin:17
基于Debian/Ubuntu,包含官方OpenJDK 17和sed、grep等基础系统工具,稳定性和兼容性有保障:
image: eclipse-temurin:17
2. openjdk:17-slim
比java:17基础镜像多预装了常用系统工具,同时保持体积较小,适合只需要基础工具的场景:
image: openjdk:17-slim
3. maven:3.8-openjdk-17
如果作业还涉及Maven构建,这个镜像集成了Maven和OpenJDK 17,同时自带sed等工具:
image: maven:3.8-openjdk-17
这些镜像无需额外安装依赖,可直接沿用原有的script逻辑。
内容的提问来源于stack exchange,提问作者kladderradatsch
相关产品推荐
相关产品推荐

