如何使用python和Java运行Docker?
我需要在docker容器中同时使用java和python来运行一些代码 这是我的dockerfile: 如果我不添加openjdk:slim中的,它将正常工作如何使用python和Java运行Docker?,java,python,python-3.x,docker,Java,Python,Python 3.x,Docker,我需要在docker容器中同时使用java和python来运行一些代码 这是我的dockerfile: 如果我不添加openjdk:slim中的,它将正常工作 #get python FROM python:3.6-slim RUN pip install --trusted-host pypi.python.org flask #get openjdk FROM openjdk:slim COPY . /targetdir WORKDIR /targetdir # Make por
#get python
FROM python:3.6-slim
RUN pip install --trusted-host pypi.python.org flask
#get openjdk
FROM openjdk:slim
COPY . /targetdir
WORKDIR /targetdir
# Make port 81 available to the world outside this container
EXPOSE 81
CMD ["python", "test.py"]
并且test.py应用程序位于同一目录中:
from flask import Flask
import os
app = Flask(__name__)
@app.route("/")
def hello():
html = "<h3>Test:{test}</h3>"
test = os.environ['JAVA_HOME']
return html.format(test = test)
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0',port=81)
我到底做错了什么?我是docker的新手,也许我错过了一步
其他详细信息
我的目标
我必须运行一个运行Java文件的python程序。我使用的python库需要JAVA\u HOME
的路径
我的问题:
- 我不懂Java,因此无法正确运行该文件
- 我的全部代码都是用Python编写的,除了这个Java代码
- Python包装器以我需要的方式运行文件
,您可以告诉docker在openjdk容器(没有python)中执行所有后续命令
为此,我将为openjdk和python创建两个单独的容器,并为它们指定单独的命令集
Docker是用来模块化您的解决方案的,而将所有内容混合到一个容器中通常是一种糟糕的做法 您可以单独安装Java,而不是使用openjdk:slim中的,请参考以下示例:
# Install OpenJDK-8
RUN apt-get update && \
apt-get install -y openjdk-8-jdk && \
apt-get install -y ant && \
apt-get clean;
# Fix certificate issues
RUN apt-get update && \
apt-get install ca-certificates-java && \
apt-get clean && \
update-ca-certificates -f;
# Setup JAVA_HOME -- useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME
好吧,我花了一点时间才弄明白。我要感谢你
我认为我的方法不起作用,因为我没有Linux的基本版本
所以它是这样的:
获取Linux(我使用Alpine,因为它是赤裸裸的)
通过包管理器获取Java
抓住Python,PIP
可选:查找并设置JAVA\u主页
找到JAVA_主页的路径。也许有更好的方法可以做到这一点,但我是通过运行容器来实现的,然后我使用docker exec-it[COINTAINER ID]bin/bash查看了容器内部并找到了它
在dockerfile中设置JAVA\u HOME
,然后构建并再次运行
下面是最后一个Dockerfile(它应该与问题中的python代码一起使用):
我是Docker的新手,所以这可能不是最好的解决方案。我愿意接受建议
更新:常见iSUUE
- 使用python软件包的困难
正如所指出的,Alpine在某些python包中可能存在问题。
我建议您使用最适合您的Linux发行版,例如centos。您的dockerfile中应该有一个
(除非你对docker使用多阶段构建)哦,让我加上我的五美分。我将python slim作为基本图像。然后我发现open-jdk-11(注意,open-jdk-10将失败,因为它不受支持)基本映像代码!。。。复制并粘贴到我的docker文件中
注意,复制粘贴驱动的开发很酷。。。只有当您理解代码中使用的每一行时
就在这里
<!-- language: shell -->
FROM python:3.7.2-slim
# Do your stuff, install python.
# and now Jdk
RUN rm -rf /var/lib/apt/lists/* && apt-get clean && apt-get update && apt-get upgrade -y \
&& apt-get install -y --no-install-recommends curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ENV JAVA_VERSION jdk-11.0.2+7
COPY slim-java* /usr/local/bin/
RUN set -eux; \
ARCH="$(dpkg --print-architecture)"; \
case "${ARCH}" in \
ppc64el|ppc64le) \
ESUM='c18364a778b1b990e8e62d094377af48b000f9f6a64ec21baff6a032af06386d'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.1%2B13/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.1_13.tar.gz'; \
;; \
s390x) \
ESUM='e39aacc270731dadcdc000aaaf709adae7a08113ccf5b4a045bc87fc13458d71'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11%2B28/OpenJDK11-jdk_s390x_linux_hotspot_11_28.tar.gz'; \
;; \
amd64|x86_64) \
ESUM='d89304a971e5186e80b6a48a9415e49583b7a5a9315ba5552d373be7782fc528'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.2%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_7.tar.gz'; \
;; \
aarch64|arm64) \
ESUM='b66121b9a0c2e7176373e670a499b9d55344bcb326f67140ad6d0dc24d13d3e2'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.1%2B13/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.1_13.tar.gz'; \
;; \
*) \
echo "Unsupported arch: ${ARCH}"; \
exit 1; \
;; \
esac; \
curl -Lso /tmp/openjdk.tar.gz ${BINARY_URL}; \
sha256sum /tmp/openjdk.tar.gz; \
mkdir -p /opt/java/openjdk; \
cd /opt/java/openjdk; \
echo "${ESUM} /tmp/openjdk.tar.gz" | sha256sum -c -; \
tar -xf /tmp/openjdk.tar.gz; \
jdir=$(dirname $(dirname $(find /opt/java/openjdk -name javac))); \
mv ${jdir}/* /opt/java/openjdk; \
export PATH="/opt/java/openjdk/bin:$PATH"; \
apt-get update; apt-get install -y --no-install-recommends binutils; \
/usr/local/bin/slim-java.sh /opt/java/openjdk; \
apt-get remove -y binutils; \
rm -rf /var/lib/apt/lists/*; \
rm -rf ${jdir} /tmp/openjdk.tar.gz;
ENV JAVA_HOME=/opt/java/openjdk \
PATH="/opt/java/openjdk/bin:$PATH"
ENV JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport"
来自python:3.7.2-slim
#完成你的工作,安装python。
#现在是Jdk
运行rm-rf/var/lib/apt/lists/*&&apt-get-clean&&apt-get-update&&apt-get-upgrade-y\
&&apt get install-y--没有安装ca证书\
&&rm-rf/var/lib/apt/lists/*
ENV JAVA_版本jdk-11.0.2+7
复制slim java*/usr/local/bin/
运行集-eux\
ARCH=“$(dpkg——打印体系结构)”\
中的大小写“${ARCH}”\
ppc64el | ppc64le)\
ESUM='c18364a778b1b990e8e62d094377af48b000f9f6a64ec21baff6a032af06386d'\
二进制的https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.1%2B13/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.1_13.tar.gz'\
;; \
s390x)\
ESUM='E39AACC270731DADC000AAAF709ADE7A08113CCF5B4A045BC87FC13458D71'\
二进制的https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11%2B28/OpenJDK11-jdk_s390x_linux_hotspot_11_28.tar.gz'\
;; \
amd64 | x86 | U 64)\
ESUM='d89304a971e5186e80b6a48a9415e49583b7a5a9315ba5552d373be7782fc528'\
二进制的https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.2%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_7.tar.gz'\
;; \
aarch64 | arm64)\
ESUM='b66121b9a0c2e7176373e670a499b9d55344bcb326f67140ad6d0dc24d13d3e2'\
二进制的https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.1%2B13/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.1_13.tar.gz'\
;; \
*) \
echo“Unsupported arch:${arch}”\
出口1\
;; \
以撒\
curl-Lso/tmp/openjdk.tar.gz${BINARY_URL}\
sha256sum/tmp/openjdk.tar.gz\
mkdir-p/opt/java/openjdk\
cd/opt/java/openjdk\
echo“${ESUM}/tmp/openjdk.tar.gz”| sha256sum-c-\
tar-xf/tmp/openjdk.tar.gz\
jdir=$(dirname$(dirname$(find/opt/java/openjdk-name javac))\
mv${jdir}/*/opt/java/openjdk\
export PATH=“/opt/java/openjdk/bin:$PATH”\
易于获得更新;apt-get-install-y——没有安装建议使用binutils\
/usr/local/bin/slim-java.sh/opt/java/openjdk\
apt-get-y-binutils\
rm-rf/var/lib/apt/lists/*\
rm-rf${jdir}/tmp/openjdk.tar.gz;
ENV JAVA_HOME=/opt/JAVA/openjdk\
PATH=“/opt/java/openjdk/bin:$PATH”
ENV JAVA_TOOL_OPTIONS=“-XX:+UseContainerSupport”
现在是参考文献。
我用它们来回答这个问题,这也许会对你有所帮助。
解决上述问题的一个更简单的方法是使用多级docker容器,您可以在其中将内容从一个容器复制到另一个容器。在上述情况下,您可以使用openjdk:slim
作为基本容器,然后使用python容器中的内容复制到此基本容器中,如下所示:
FROM openjdk:slim
COPY --from=python:3.6 / /
...
<normal instructions for python container continues>
...
来自openjdk的:slim
COPY--from=python:3.6//
...
...
此功能从Docker 17.05开始提供,并且还有更多功能
<!-- language: shell -->
FROM python:3.7.2-slim
# Do your stuff, install python.
# and now Jdk
RUN rm -rf /var/lib/apt/lists/* && apt-get clean && apt-get update && apt-get upgrade -y \
&& apt-get install -y --no-install-recommends curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ENV JAVA_VERSION jdk-11.0.2+7
COPY slim-java* /usr/local/bin/
RUN set -eux; \
ARCH="$(dpkg --print-architecture)"; \
case "${ARCH}" in \
ppc64el|ppc64le) \
ESUM='c18364a778b1b990e8e62d094377af48b000f9f6a64ec21baff6a032af06386d'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.1%2B13/OpenJDK11U-jdk_ppc64le_linux_hotspot_11.0.1_13.tar.gz'; \
;; \
s390x) \
ESUM='e39aacc270731dadcdc000aaaf709adae7a08113ccf5b4a045bc87fc13458d71'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11%2B28/OpenJDK11-jdk_s390x_linux_hotspot_11_28.tar.gz'; \
;; \
amd64|x86_64) \
ESUM='d89304a971e5186e80b6a48a9415e49583b7a5a9315ba5552d373be7782fc528'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.2%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.2_7.tar.gz'; \
;; \
aarch64|arm64) \
ESUM='b66121b9a0c2e7176373e670a499b9d55344bcb326f67140ad6d0dc24d13d3e2'; \
BINARY_URL='https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.1%2B13/OpenJDK11U-jdk_aarch64_linux_hotspot_11.0.1_13.tar.gz'; \
;; \
*) \
echo "Unsupported arch: ${ARCH}"; \
exit 1; \
;; \
esac; \
curl -Lso /tmp/openjdk.tar.gz ${BINARY_URL}; \
sha256sum /tmp/openjdk.tar.gz; \
mkdir -p /opt/java/openjdk; \
cd /opt/java/openjdk; \
echo "${ESUM} /tmp/openjdk.tar.gz" | sha256sum -c -; \
tar -xf /tmp/openjdk.tar.gz; \
jdir=$(dirname $(dirname $(find /opt/java/openjdk -name javac))); \
mv ${jdir}/* /opt/java/openjdk; \
export PATH="/opt/java/openjdk/bin:$PATH"; \
apt-get update; apt-get install -y --no-install-recommends binutils; \
/usr/local/bin/slim-java.sh /opt/java/openjdk; \
apt-get remove -y binutils; \
rm -rf /var/lib/apt/lists/*; \
rm -rf ${jdir} /tmp/openjdk.tar.gz;
ENV JAVA_HOME=/opt/java/openjdk \
PATH="/opt/java/openjdk/bin:$PATH"
ENV JAVA_TOOL_OPTIONS="-XX:+UseContainerSupport"
FROM openjdk:slim
COPY --from=python:3.6 / /
...
<normal instructions for python container continues>
...
FROM rappdw/docker-java-python:openjdk1.8.0_171-python3.6.6
RUN java -version
RUN python --version
# Get Linux
FROM centos:7
# Install Java
RUN yum update -y \
&& yum install java-1.8.0-openjdk -y \
&& yum clean all \
&& rm -rf /var/cache/yum
# Set JAVA_HOME environment var
ENV JAVA_HOME="/usr/lib/jvm/jre-openjdk"
# Install Python
RUN yum install python3 -y \
&& pip3 install --upgrade pip setuptools wheel \
&& if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi \
&& if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi \
&& yum clean all \
&& rm -rf /var/cache/yum
CMD ["bash"]
FROM python:3.9-slim
COPY --from=openjdk:8-jre-slim /usr/local/openjdk-8 /usr/local/openjdk-8
ENV JAVA_HOME /usr/local/openjdk-8
RUN update-alternatives --install /usr/bin/java java /usr/local/openjdk-8/bin/java 1
...