web-dev-qa-db-ja.com

DockerイメージベースのJava:8-jdk-Alpineでcurlを使用可能にし、イメージをクリーンに保つ方法

Curlコマンドを実行して結果を取得するJavaコードがあります。

Jarファイルを作成しました。jarファイルは正常に実行されます

ここで、Javaプログラムを(jarを使用して)dokerizeして、アプリケーションを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"]
17
user3356164

使用しているJavaベースイメージはAlpine Linuxのものであり、そこからcurlパッケージもダウンロードする必要があります。これが私が実稼働環境で使用したDockerfileです。

FROM openjdk:8-jre-Alpine

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

2019年5月に更新

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のコメントありがとうございます。

45
Imran

サンプルのdockerfileには、複数のFROMステートメントが含まれています。これは有効ですが、ドキュメントにあるように、各FROMは以前の 命令 から状態をクリアします。そして、新しくインストールされたカールは、2番目のFROMの後に消去されます。

6
Markus

最近では、ほとんどの言語でHTTPクライアントを簡単に使用できます。シェルスクリプトよりも高度な言語のプログラムからcurlを呼び出すことはほとんどありません。 Java.net.URLConnection はJava 1.0以来Javaの一部であり、(これを実行しようとする理由を知らずに)ほとんどここで間違いなく適切なツール。

バックトレースからexecuteCoreAPIメソッドを制御する場合、組み込みのJava HTTPクライアントを使用するように変更し、curlをインストールしようとするすべてのDockerfileパーツを削除する必要があります。

2
David Maze