如何在基于 Docker 映像的 java:8-jdk-alpine 中提供 curl 并保持映像干净?更新 05/2019

2022-08-31 14:07:07

我们有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"]

答案 1

您使用的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。


答案 2

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


推荐