70

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

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

现在,当我们尝试对 java 程序进行 docker 化(使用 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"]
4

3 回答 3

144

您使用的 Java 基础镜像是 Alpine Linux 之一,还需要从那里下载 curl 包。这是我用于生产部署的 Dockerfile。

FROM openjdk:8-jre-alpine

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

更新 05/2019

从 Alpine Linux 3.3 开始,--no-cacheapk. 它允许用户安装具有即时更新和使用的索引而不是本地缓存的软件包:

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

于 2018-07-06T11:11:05.783 回答
10

您的示例 dockerfile 包含多个FROM语句。这是有效的,但正如文档所说,每个都从先前的指令FROM中清除状态。所以新安装的 curl 在第二个之后被擦除。FROM

于 2018-07-05T13:42:56.057 回答
-7

如今,大多数语言都有现成的 HTTP 客户端。您几乎不应该使用curl比 shell 脚本更复杂的语言调用程序。 java.net.URLConnection自 Java 1.0 以来一直是 Java 的一部分,并且(不知道您为什么要为此付出代价)它几乎绝对是正确的工具。

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

于 2018-07-05T22:39:52.650 回答