如何在基于Docker映像的java:8-jdk-alpine中使curl可用并保持映像清洁?

时间:2018-07-05 13:33:48

标签: java docker docker-java

我们有运行curl命令以获取某些结果的Java代码。

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

现在,当我们尝试对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"]

3 个答案:

答案 0 :(得分:26)

您使用的Java基本映像是Alpine Linux 1,还需要从那里下载curl软件包。这是我用于生产部署的Dockerfile。

FROM openjdk:8-jre-alpine

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

更新05/2019

从Alpine Linux 3.3开始,--no-cache有一个新的apk选项。它允许用户使用实时更新和使用而不是本地缓存的索引来安装软件包:

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的评论。

答案 1 :(得分:4)

您的示例dockerfile包含多个FROM语句。这是有效的,但正如文档所述,每个FROM都会清除先前instructions的状态。因此,在第二个FROM之后擦拭了刚安装的卷发。

答案 2 :(得分:2)

如今,大多数语言都可以使用HTTP客户端。您几乎永远都不应使用比Shell脚本更复杂的语言从程序中调用g.axes[I,J].set_ylim(df.column3.min(),df.column3.max())java.net.URLConnection自Java 1.0以来一直是Java的一部分,并且(不知道为什么要为此付出努力),这里绝对是正确的工具。

假设您从回溯中控制curl方法,则应将其更改为使用内置的Java HTTP客户端,并删除所有尝试安装executeCoreAPI的Dockerfile部分。 / p>