在docker中安装openjdk会删除基本的linux commads [英] Installing openjdk in docker removes basic linux commads

查看:196
本文介绍了在docker中安装openjdk会删除基本的linux commads的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是制作一个包含qt-android和android-studio工具的码头图像。我采取像docker文件的基地这一个 ,而不是安装软件属性常见的,我已经安装了 build-essential 的libgl1-台面-dev的。 Java和这些库都成功安装,但是,基本命令,如 mkdir ls cd 变成无法识别的,使得docker构建过程返回代码127(命令未找到)。



有没有人有想法为什么会发生这种情况?

解决方案

我发现我甚至不能让你的Dockerfile显示问题,而不是提前做一些更改在图像中。实际上你的问题是:

  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

应该成为:

  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

这是因为当你设置PATH时,你不应该删除它的当前内容因此 $ PATH:),并且您要添加JAVA_HOME变量的值,而不是文字字符串JAVA_HOME(因此 $ JAVA_HOME / bin )。



此外,您使用ENV设置的任何内容都不需要导出,因为它将可用于图像中的每个进程。



我也不得不安装一些包, apt-repository可用,但我不是100%肯定如果这是因为ubuntu:latest是指系统上的不同映像(可能您应该考虑使用一个特定版本的标签,您希望使用像 ubuntu:xenial )。



我也不得不安装wget&我更正了您使用 wget -O - 的地方,您不需要(显然想要将文件写入磁盘)。



我使用的完整Docker文件&能够成功建立(我没有测试运行它,因为我不知道预期的行为和不说你的语言)是:

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

FROM ubuntu:最新
维也纳Inacio Medeiros< disappiogmedeiros@gmail.com>
USER root

#安装add-apt-repository所需的python脚本
RUN apt-get update
运行apt-get install build-essential libgl1 -mesa-dev -y --force-yes

#将语言设置为UTF8:这在几乎所有情况下都可以工作
ENV LANG pt_BR.UTF-8
RUN locale- gen $ LANG

#安装add-apt-repository
运行apt-get安装软件属性常见的python-software-properties wget -y --force-yes

#INSTALL JAVA
#=================================== =====================
#设置openjdk 8 repo
运行add-apt-repository ppa:openjdk-r / ppa

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

#设置JAVA_HOME和其他环境变量,这对于docker命令行
有用JAV_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
#=============================================== =============

#安装QT Android
#================== $ // $ b $ m运行mkdir / var / tmp / qt-android \
&& cd / var / tmp / qt-android \
&& wgethttp://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

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

#安装Ant
运行apt-get install ant - y --force-yes

#安装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 \
&&& wgethttp://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

#运行SDK更新
运行cd / opt / android-sdk / tools \
&& chmod 777 android

CMD / opt / android-sdk / tools / android更新sdk

#更新库
RUN apt-get update&& apt-get upgrade -y --force-yes

#安装库
运行apt-get install -y --force-yes libstdc ++ 6 libgcc1 zlib1g libncurses5
RUN apt-get install -y --force-yes libsdl1.2debian

#安装Android studio
#资料来源:https://github.com/wolfitem/docker/blob/master/Dockerfiles / android-studio / Dockerfile
运行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
运行apt-get clean
运行apt-get purge

USER开发人员

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

我注意到的事情是有一些地方,你做一些像 CMD /var/tmp/qt-android/qt-opensource-linux-x64-android-5.5.0-2这样的地方。运行其中您希望运行 /var/tmp/qt-android/qt-opensource-linux-x64-android-5.5.0-2.run 。我认为你可能误解了CMD的作用 - 实际上并没有运行那个命令,它设置好了,所以当你使用 docker运行将是默认命令。



如果我不得不重构Dockerfile,我会使它看起来更像下面的那个。但是,由于我改变了它,所以目前无法构建,实际上是调用上面提到的。目前 qt-opensource-linux-x64-android-5.5.0-2.run 失败,因为它无法找到要连接的显示。

 从ubuntu:最新
维护者Inacio Medeiros< disappiogmedeiros@gmail.com&

#安装add-apt-repository所需的python脚本
RUN apt-get update \
&&& apt-get install -y --force-yes \
build-essential \
libgl1-mesa-dev \
python-software-properties \
software-属性常见\
wget \
&&& apt-get clean \
&& rm -rf / var / lib / apt / lists / * / tmp / * / var / tmp / *

#将语言设置为UTF8:这在几乎所有情况下都可以工作
ENV LANG pt_BR.UTF-8
运行语言环境$ LANG

#INSTALL JAVA
#================= =========================================
#设置openjdk 8 repo
运行add-apt-repository ppa:openjdk -r / ppa

#安装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 / *

#设置JAVA_HOME和其他环境变量,这对于docker命令行
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
#====================================== ====================

#安装QT Android
#============= 。。。。。。。。。。。 b $ b RUN mkdir -p / var / tmp / qt-android \
&&& cd / var / tmp / qt-android \
&& wgethttp://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
#============================== ========================

#安装Ant
运行apt-get update \
&& apt-get install -y --force-yes \
ant \
&& apt-get clean \
&& rm -rf / var / lib / apt / lists / * / tmp / * / var / tmp / *

#安装SDK
运行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 \
&&& wgethttp://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

#运行SDK更新
RUN cd / opt / android-sdk / tools \
&& chmod 777 android \
&&& / opt / android-sdk / tools / android update sdk

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

#安装库
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 / *

#安装Android studio
#来源:https://github.com/ wolfitem / docker / blob / master / Dockerfiles / android-studio / Dockerfile
RUN apt-get update \
&&& apt-get install -y --force-yes \
解压缩\
&&& 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开发人员

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

如果您有任何其他问题,请告诉我,我会尽力回答。


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).

Does anyone have and idea why does this occurs?

解决方案

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 <inaciogmedeiros@gmail.com>
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 <inaciogmedeiros@gmail.com>

# 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.

这篇关于在docker中安装openjdk会删除基本的linux commads的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆