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"]
使用しているJavaベースイメージはAlpine Linuxのものであり、そこからcurlパッケージもダウンロードする必要があります。これが私が実稼働環境で使用したDockerfileです。
FROM openjdk:8-jre-Alpine
RUN apk add --update \
curl \
&& rm -rf /var/cache/apk/*
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のコメントありがとうございます。
サンプルのdockerfileには、複数のFROM
ステートメントが含まれています。これは有効ですが、ドキュメントにあるように、各FROM
は以前の 命令 から状態をクリアします。そして、新しくインストールされたカールは、2番目のFROM
の後に消去されます。
最近では、ほとんどの言語でHTTPクライアントを簡単に使用できます。シェルスクリプトよりも高度な言語のプログラムからcurl
を呼び出すことはほとんどありません。 Java.net.URLConnection はJava 1.0以来Javaの一部であり、(これを実行しようとする理由を知らずに)ほとんどここで間違いなく適切なツール。
バックトレースからexecuteCoreAPI
メソッドを制御する場合、組み込みのJava HTTPクライアントを使用するように変更し、curl
をインストールしようとするすべてのDockerfileパーツを削除する必要があります。