Inácio Medeiros
Inácio Medeiros

Reputation: 95

Installing openjdk in docker removes basic linux commands

I aim to make a docker image that contains qt-android and android-studio tool. I took like base for dockerfile this one, and, instead of installing software-properties-common, I've put to install build-essential and libgl1­-mesa­-dev. Both Java and theses libraries were installed with success, but, then, basic commands like mkdir, ls, cd turned to be unrecognizable, making docker build process return with code 127 (command not found).

Why does this occurs?

Upvotes: 1

Views: 4819

Answers (1)

joelnb
joelnb

Reputation: 1494

I found that I couldn't even get your Dockerfile to display the issue without making some changes earlier in the image. The bit that was actually your problem though is:

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
ENV PATH JAVA_HOME/bin
ENV CLASSPATH JAVA_HOME/lib/tools.jar
ENV MANPATH JAVA_HOME/man
RUN export JAVA_HOME PATH CLASSPATH MANPATH 

Should become:

ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
ENV PATH $PATH:$JAVA_HOME/bin
ENV CLASSPATH $JAVA_HOME/lib/tools.jar
ENV MANPATH $JAVA_HOME/man

This is because when you set the PATH you shouldn't remove the current contents of it (hence $PATH:) and you want to add the value of the JAVA_HOME variable rather than the literal string JAVA_HOME (hence $JAVA_HOME/bin).

Also, anything you set with ENV you will not need to export as it will be available for every process in your image.

I also had to install some packages to make add-apt-repository available but I'm not 100% sure if this is because ubuntu:latest refers to a different image on my system (possibly you should consider using a tag for the specific version you wish to use like ubuntu:xenial).

I also had to install wget & I corrected a number of places where you were using wget -O - where you didn't mean to (as you clearly wanted to write the files to disk).

The full Dockerfile which I used & was able to get to successfully build (I didn't test running it as I'm not sure on expected behaviour & don't speak your language) is:

 # BASED ON : https://hub.docker.com/r/picoded/ubuntu-openjdk-8-jdk/~/dockerfile/

FROM ubuntu:latest
MAINTAINER Inacio Medeiros <[email protected]>
USER root

# Install the python script required for "add-apt-repository"
RUN apt-get update
RUN apt-get install build-essential libgl1-mesa-dev -y --force-yes

# Sets language to UTF8 : this works in pretty much all cases
ENV LANG pt_BR.UTF-8
RUN locale-gen $LANG

# Install add-apt-repository
RUN apt-get install software-properties-common python-software-properties wget -y --force-yes

# INSTALL JAVA
# ==============================================================
# Setup the openjdk 8 repo
RUN add-apt-repository ppa:openjdk-r/ppa

# Install java8
RUN apt-get update && apt-get install openjdk-8-jdk -y --force-yes

# Setup JAVA_HOME and other environment variables, this is useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
ENV PATH $PATH:$JAVA_HOME/bin
ENV CLASSPATH $JAVA_HOME/lib/tools.jar
ENV MANPATH $JAVA_HOME/man
# ==============================================================

# Install QT Android
# ==============================================================
RUN mkdir /var/tmp/qt-android \
      && cd /var/tmp/qt-android \
      && wget "http://download.qt.io/official_releases/qt/5.5/5.5.0/qt-opensource-linux-x64-android-5.5.0-2.run" \
      && chmod 777 qt-opensource-linux-x64-android-5.5.0-2.run

CMD /var/tmp/qt-android/qt-opensource-linux-x64-android-5.5.0-2.run

RUN cd /var/tmp/qt-android \
      && cd .. \
      && rm -rf /var/tmp/qt-android
# ==============================================================

# Install Ant
RUN apt-get install ant -y --force-yes

# Install SDK
RUN mkdir /opt/android-sdk \
      && cd /opt/android-sdk \
      && wget -O - "http://dl.google.com/android/android-sdk_r24.3.4-linux.tgz" \
      | tar --strip-components=1 -zxf -

#Install NDK
RUN mkdir /var/tmp/ndk \
      && cd /var/tmp/ndk \
      && wget "http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin" \
      && chmod 777 android-ndk-r10e-linux-x86_64.bin

CMD /var/tmp/ndk/android-ndk-r10e-linux-x86_64.bin

RUN cd /var/tmp/ndk \
      && cd .. \
      && rm -rf ndk

# Run SDK Update
RUN cd /opt/android-sdk/tools \
       && chmod 777 android

CMD /opt/android-sdk/tools/android update sdk

# Update libraries
RUN apt-get update && apt-get upgrade -y --force-yes

# Install libraries
RUN apt-get install -y --force-yes libstdc++6 libgcc1 zlib1g libncurses5
RUN apt-get install -y --force-yes libsdl1.2debian

# Install Android studio
# Source: https://github.com/wolfitem/docker/blob/master/Dockerfiles/android-studio/Dockerfile
RUN apt-get install unzip -y --force-yes
RUN wget 'https://dl.google.com/dl/android/studio/ide-zips/2.1.0.9/android-studio-ide-143.2790544-linux.zip' -O /tmp/studio.zip && unzip -d /opt /tmp/studio.zip && rm /tmp/studio.zip


#clean up
RUN apt-get clean
RUN apt-get purge

USER developer

CMD /opt/android-studio/bin/studio.sh

The thing which I did notice is there are a number of places where you do something like CMD /var/tmp/qt-android/qt-opensource-linux-x64-android-5.5.0-2.run where it looks like you are wanting to run /var/tmp/qt-android/qt-opensource-linux-x64-android-5.5.0-2.run. I think you have possibly misunderstood what CMD does - it doesn't actually run that command, it sets it up so that when you run a container from the image with docker run that will be the default command.

If I had to refactor the Dockerfile I would make it look more like the one below. But this currently fails to build because I changed it to actually call the things mentioned above. Currently qt-opensource-linux-x64-android-5.5.0-2.run fails because it can't find a display to connect to.

FROM ubuntu:latest
MAINTAINER Inacio Medeiros <[email protected]>

# Install the python script required for "add-apt-repository"
RUN apt-get update \
    && apt-get install -y --force-yes \
        build-essential \
        libgl1-mesa-dev \
        python-software-properties \
        software-properties-common \
        wget \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Sets language to UTF8 : this works in pretty much all cases
ENV LANG pt_BR.UTF-8
RUN locale-gen $LANG

# INSTALL JAVA
# ==============================================================
# Setup the openjdk 8 repo
RUN add-apt-repository ppa:openjdk-r/ppa

# Install java8
RUN apt-get update \
    && apt-get install -y --force-yes \
        openjdk-8-jdk \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Setup JAVA_HOME and other environment variables, this is useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
ENV PATH $PATH:$JAVA_HOME/bin
ENV CLASSPATH $JAVA_HOME/lib/tools.jar
ENV MANPATH $JAVA_HOME/man
# ==============================================================

# Install QT Android
# ==============================================================
RUN mkdir -p /var/tmp/qt-android \
    && cd /var/tmp/qt-android \
    && wget "http://download.qt.io/official_releases/qt/5.5/5.5.0/qt-opensource-linux-x64-android-5.5.0-2.run" \
    && chmod 777 qt-opensource-linux-x64-android-5.5.0-2.run \
    && /var/tmp/qt-android/qt-opensource-linux-x64-android-5.5.0-2.run \
    && cd / \
    && rm -rf /var/tmp/qt-android
# ==============================================================

# Install Ant
RUN apt-get update \
    && apt-get install -y --force-yes \
        ant \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install SDK
RUN mkdir -p /opt/android-sdk \
    && cd /opt/android-sdk \
    && wget -O - "http://dl.google.com/android/android-sdk_r24.3.4-linux.tgz" \
        | tar --strip-components=1 -zxf -

#Install NDK
RUN mkdir /var/tmp/ndk \
      && cd /var/tmp/ndk \
      && wget "http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin" \
      && chmod 777 android-ndk-r10e-linux-x86_64.bin \
      && /var/tmp/ndk/android-ndk-r10e-linux-x86_64.bin \
      && cd / \
      && rm -rf /var/tmp/ndk

# Run SDK Update
RUN cd /opt/android-sdk/tools \
    && chmod 777 android \
    && /opt/android-sdk/tools/android update sdk

# Update libraries
RUN apt-get update \
    && apt-get upgrade -y --force-yes \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install libraries
RUN apt-get update \
    && apt­-get install -y --force-yes \
        libstdc++6 \
        libgcc1 \
        libsdl1.2debian \
        zlib1g \
        libncurses5 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# Install Android studio
# Source: https://github.com/wolfitem/docker/blob/master/Dockerfiles/android-studio/Dockerfile
RUN apt-get update \
    && apt-get install -y --force-yes \
        unzip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN wget 'https://dl.google.com/dl/android/studio/ide-zips/2.1.0.9/android-studio-ide-143.2790544-linux.zip' -O /tmp/studio.zip \
    && unzip -d /opt /tmp/studio.zip \
    && rm /tmp/studio.zip

USER developer

CMD /opt/android-studio/bin/studio.sh

Let me know if you have any further questions and I will do my best to answer them.

Upvotes: 1

Related Questions