Docker容器内curl下载的opentelemetry-javaagent.jar无法使用问题求助
Docker中curl下载opentelemetry-javaagent.jar报错的解决方法
问题原因
GitHub Releases的下载链接会自动重定向到CDN节点,默认情况下curl不会自动跟随HTTP重定向,导致实际下载的内容是跳转页面的HTML代码,而非真正的JAR文件。启动时JVM校验JAR完整性失败,就会抛出Error opening zip file or JAR manifest missing错误。
而使用ADD指令本地导入文件时,直接复制的是你手动下载好的完整JAR包,不存在下载过程中的重定向问题,因此可以正常运行。
解决方案
1. 给curl添加重定向跟随参数
修改Dockerfile中的curl命令,加上-L参数强制跟随重定向:
RUN curl -L https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.30.0/opentelemetry-javaagent.jar -o /tmp/opentelemetry-javaagent.jar && \ chmod 540 /tmp/opentelemetry-javaagent.jar
2. 可选:验证文件完整性(推荐)
为了确保下载的JAR文件没有损坏,可以添加SHA256哈希校验步骤(哈希值可从对应版本的GitHub Release页面获取):
RUN curl -L https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.30.0/opentelemetry-javaagent.jar -o /tmp/opentelemetry-javaagent.jar && \ echo "替换为v1.30.0版本的SHA256校验值 /tmp/opentelemetry-javaagent.jar" | sha256sum -c - && \ chmod 540 /tmp/opentelemetry-javaagent.jar
3. 替代方案:使用wget下载
wget默认会自动跟随重定向,也可以解决这个问题:
RUN wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.30.0/opentelemetry-javaagent.jar -O /tmp/opentelemetry-javaagent.jar && \ chmod 540 /tmp/opentelemetry-javaagent.jar
修改后的完整Dockerfile示例
FROM eclipse-temurin:17-jre ARG RUN_JAVA_VERSION=1.3.8 ENV APP my-project ENV JAVA_OPTIONS="-XshowSettings:vm" ENV SPRING_PROFILES_ACTIVE=docker ENV JAVA_TOOL_OPTIONS -agentlib:jdwp=transport=dt_socket,address=10200,server=y,suspend=n -javaagent:/tmp/opentelemetry-javaagent.jar -Dotel.service.name=format-adapter -Dotel.traces.exporter=zipkin WORKDIR /app RUN apt-get update -q \ && apt-get install -y --no-install-recommends wget curl \ && rm -Rf /var/lib/apt /var/cache/apt RUN curl https://repo1.maven.org/maven2/io/fabric8/run-java-sh/${RUN_JAVA_VERSION}/run-java-sh-${RUN_JAVA_VERSION}-sh.sh -o /app/run-java.sh && \ chmod 540 /app/run-java.sh # 修复后的curl命令 RUN curl -L https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.30.0/opentelemetry-javaagent.jar -o /tmp/opentelemetry-javaagent.jar && \ chmod 540 /tmp/opentelemetry-javaagent.jar ADD build/libs/${APP}-*.jar /app/${APP}.jar HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost:${SERVER_PORT}/actuator/health || exit 1 ENTRYPOINT ["/app/run-java.sh"]
内容的提问来源于stack exchange,提问作者João Matos
相关产品推荐
相关产品推荐

