Как сделать скручиваемость доступной в Docker на основе изображений java: 8-jdk-alpine и сохранить изображение в чистоте? - PullRequest
0 голосов
/ 05 июля 2018

У нас есть 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"]

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

В наши дни большинство языков имеют готовые HTTP-клиенты; Вы почти никогда не должны вызывать curl из программы на более сложном языке, чем сценарий оболочки. java.net.URLConnection является частью Java начиная с Java 1.0 и (не зная, почему вы пытаетесь раскошелиться на это), это почти наверняка правильный инструмент здесь.

Предполагая, что вы управляете методом executeCoreAPI из своей трассировки, вы должны изменить его на использование встроенного Java-HTTP-клиента и просто удалить все части Dockerfile, которые пытаются установить curl.

0 голосов
/ 06 июля 2018

Базовым образом Java, который вы используете, является Alpine Linux one, и пакет curl также должен быть загружен оттуда. Вот Dockerfile, который я использовал для производственного развертывания.

FROM openjdk:8-jre-alpine

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

Обновление 05/2019

Начиная с 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 за комментарий.

0 голосов
/ 05 июля 2018

Ваш пример dockerfile содержит несколько FROM операторов. Это верно, но, как говорится в документации, каждый FROM очищает состояние от предыдущих инструкций . И вот свежий установленный локон стирается после второго FROM.

...