我们有运行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"]
答案 0 :(得分:26)
您使用的Java基本映像是Alpine Linux 1,还需要从那里下载curl软件包。这是我用于生产部署的Dockerfile。
FROM openjdk:8-jre-alpine
RUN apk add --update \
curl \
&& rm -rf /var/cache/apk/*
从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>