How to make curl available in Docker image based java:8-jdk-alpine and keep the image clean?
Asked Answered
A

3

82

We are having java code that runs curl command to fetch the some result.

We have built a jar file and the jar file executes fine

Now, when we try to dokerize the java program (using jar) and run the application in docker we get this error:

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 used :

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"]
Acerbity answered 5/7, 2018 at 13:33 Comment(0)
P
174

The Java base image you are using is Alpine Linux one and curl package also needs to be downloaded from there. Here is Dockerfile I have used for Production deployments.

FROM openjdk:8-jre-alpine

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

Update 05/2019

As of Alpine Linux 3.3 there exists a new --no-cache option for apk. It allows users to install packages with an index that is updated and used on-the-fly and not cached locally:

FROM openjdk:8-jre-alpine
    
RUN apk --no-cache add curl

This avoids the need to use --update and remove /var/cache/apk/* when done installing packages.

Reference - https://github.com/gliderlabs/docker-alpine/blob/master/docs/usage.md and Thank you @Daniel for the comment.

Parrie answered 6/7, 2018 at 11:11 Comment(3)
Recent versions of apk support a more concise syntax: apk --no-cache add curlGewirtz
No matter I tried it keeps saying "/bin/sh: curl: not found"Chloroform
network error (check Internet connection and firewall)Sotos
M
11

Your example dockerfile contains multiple FROM statements. This is valid but as the documentation says each FROM clears the state from previous instructions. And so the fresh installed curl is wiped after the second FROM.

Midyear answered 5/7, 2018 at 13:42 Comment(8)
Markus you are not right. With docker 17.05 there is a major change. Please adjust your answer. RefAntaeus
Thank you for the advice. I was not aware of that feature. :)Midyear
Sure, no problem, and the answer is correct now - curl will not be available as its wiped out.Antaeus
Curl is not unavailable because it has been "wiped out", curl just is not part of Alpine by default.Regularly
@CaptainMan: But it is going to be installed in the Dockerfile and will be wiped after the second FROM statement.Midyear
@Midyear The build's first stage using Ubuntu should still produce an image that has curl installed though.Regularly
Yes, but it is wiped after the second FROM switching to Alpine. See reference link in first comment.Midyear
Unfortunately the laptop I am on right now can't run Docker (Windows 7) so I cannot test, but I could've sworn running docker images would show the intermediate stages as unnamed images. Maybe this is just an issue of word usage though. When I see "wiped out" I think deleted, but as I'm saying I don't think it is. That said, the state of the build is wiped, but it seems like a moot point to mention it when talking about installed packages as opposed to things like WORKDIR or ADD -- especially since Ubuntu and Alpine don't use the same package manager so the commands would be different.Regularly
D
0

Use this Command -- > apk add curl

Decal answered 15/11, 2023 at 11:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.