Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python和Java运行Docker?_Java_Python_Python 3.x_Docker - Fatal编程技术网

如何使用python和Java运行Docker?

如何使用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

我需要在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 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包装器以我需要的方式运行文件


我相信通过从openjdk:slim添加
,您可以告诉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
    ...