bashdockerdockerfilesdkman

Cannot build dockerfile with sdkman


I am entirely new to the concept of dockers. I am creating the following Dockerfile as an exercise.

FROM ubuntu:latest

MAINTAINER kesarling

RUN apt update && apt upgrade -y
RUN apt install nginx curl zip unzip -y
RUN apt install openjdk-14-jdk python3 python3-doc clang golang-go gcc g++ -y
RUN curl -s "https://get.sdkman.io" | bash
RUN bash /root/.sdkman/bin/sdkman-init.sh
RUN sdk version
RUN yes | bash -c 'sdk install kotlin'

CMD [ "echo","The development environment has now been fully setup with C, C++, JAVA, Python3, Go and Kotlin" ]

I am using SDKMAN! to install Kotlin. The problem initially was that instead of using RUN bash /root/.sdkman/bin/sdkman-init.sh, I was using RUN source /root/.sdkman/bin/sdkman-init.sh. However, it gave the error saying source not found. So, I tried using RUN . /root/.sdkman/bin/sdkman-init.sh, and it did not work. However, RUN bash /root/.sdkman/bin/sdkman-init.sh seems to work, as in does not give any error and tries to run the next command. However, the docker then gives error saying sdk: not found

Where am I going wrong?

It should be noted that these steps worked like charm for my host distribution (The one on which I'm running docker) which is Pop!_OS 20.04


Solution

  • Actually the script /root/.sdkman/bin/sdkman-init.sh sources the sdk

    source is a built-in to bash rather than a binary somewhere on the filesystem.

    source command executes the file in the current shell.

    Each RUN instruction will execute any commands in a new layer on top of the current image and commit the results.

    The resulting committed image will be used for the next step in the Dockerfile.

    Try this:

    FROM ubuntu:latest
    
    MAINTAINER kesarling
    
    RUN apt update && apt upgrade -y
    RUN apt install nginx curl zip unzip -y
    RUN apt install openjdk-14-jdk python3 python3-doc clang golang-go gcc g++ -y
    RUN curl -s "https://get.sdkman.io" | bash
    RUN /bin/bash -c "source /root/.sdkman/bin/sdkman-init.sh; sdk version; sdk install kotlin"
    
    CMD [ "echo","The development environment has now been fully setup with C, C++, JAVA, Python3, Go and Kotlin" ]