如何使卷曲可在 Docker 图像基于 java: 8-jdk-alpine 和保持图像清洁?

我们使用 Java 代码运行 curl 命令来获取某些结果。

我们已经构建了一个 jar 文件,并且这个 jar 文件执行得很好

现在,当我们尝试 dokerize java 程序(使用 jar)并在 docker 中运行应用程序时,我们会得到这个错误:

errorjava.io.IOException: Cannot run program "curl": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at com.ps.api.common.CoreAPI_Spec.executeCoreAPI(CoreAPI_Spec.java:295)
at com.ps.api.common.CoreAPI_Spec.getAccessTokens(CoreAPI_Spec.java:319)

使用 Dockerfile:

FROM ubuntu:16.04
MAINTAINER niro;


# Install prerequisites
RUN apt-get update && apt-get install -y \
curl


FROM java:8-jdk-alpine
# Set the working directory to /app
WORKDIR /Users/******/Desktop/CoreAPI_Jar


# Copy the current directory contents into the container at /app
ADD *******_Automation-0.0.1-SNAPSHOT-jar-with-dependencies.jar ******_Automation-0.0.1-SNAPSHOT-jar-with-dependencies.jar


# Run app.py when the container launches
CMD ["java", "-jar", "******-0.0.1-SNAPSHOT-jar-with-dependencies.jar"]
132145 次浏览

示例 dockerfile 包含多个 FROM语句。这是有效的,但是正如文档中所说的,每个 FROM都会从以前的 指示中清除该状态。因此,新安装的卷曲擦拭后,第二个 FROM

如今,大多数语言都有容易使用的 HTTP 客户端; 您几乎不应该使用比 shell 脚本更复杂的语言从程序中调用 curl。自 Java 1.0以来,URLConnection一直是 Java 的一部分,而且(不知道为什么要为此掏腰包)它几乎肯定是正确的工具。

假设您通过回溯跟踪控制了 executeCoreAPI方法,那么您应该将其更改为使用内置的 Java HTTP 客户端,并删除所有试图安装 curl的 Dockerfile 部分。

您正在使用的 Java 基本映像是 Alpine Linux one,还需要从那里下载 curl 包。下面是我用于生产部署的 Dockerfile。

FROM openjdk:8-jre-alpine


RUN apk add --update \
curl \
&& rm -rf /var/cache/apk/*

更新05/2019

从 Alpine Linux 3.3开始,apk就有了一个新的 --no-cache选项。它允许用户安装带有索引的软件包,这个索引可以动态更新和使用,并且不会在本地缓存:

FROM openjdk:8-jre-alpine
    

RUN apk --no-cache add curl

这避免了在安装包时使用 --update和删除 /var/cache/apk/*的需要。

参考文献- Https://github.com/gliderlabs/docker-alpine/blob/master/docs/usage.md 谢谢@Daniel 的评论。