it-swarm.com.de

Wie kann ich Docker mit Python und Java ausführen?

Ich brauche Java und Python in meinem Docker-Container, um Code auszuführen. 

Dies ist meine Docker-Datei: Es funktioniert einwandfrei, wenn ich nicht das FROM 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"]

Und die test.py-App befindet sich im selben Verzeichnis:

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 __== '__main__':
    app.run(debug=True,Host='0.0.0.0',port=81)

Ich erhalte diesen Fehler: 

D:\MyApps\Docker Toolbox\Docker Toolbox\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"python\": executable file not found in $PATH": unknown.

Was genau mache ich hier falsch? Ich bin neu bei Docker, vielleicht fehlt mir ein Schritt.

Weitere Details

Mein Ziel  

Ich muss ein Python-Programm ausführen, das eine Java-Datei ausführt. Die Python-Bibliothek, die ich verwende, erfordert den Pfad zu Java_HOME.

Meine Ausgaben:

  • Ich kenne Java nicht, daher kann ich die Datei nicht ordnungsgemäß ausführen.

  • Mein gesamter Code ist in Python, außer diesem Java-Bit

  • Der Python-Wrapper führt die Datei in einer Weise aus, die ich zum Ausführen benötige.

3
pajamas

OK, ich brauchte eine Weile, um es herauszufinden. Und mein Dank geht an diese Antwort .

Ich denke, mein Ansatz hat nicht funktioniert, da ich keine Basisversion von Linux hatte. 

So geht es so:

  1. Holen Sie sich Linux (ich verwende Alpine, weil es Barebones ist)
  2. Holen Sie sich Java über den Paketmanager
  3. Holen Sie sich Python, PIP

OPTIONAL: Suchen und setzen Sie Java_HOME

  1. Suchen Sie den Pfad zu Java_HOME. Vielleicht gibt es einen besseren Weg, dies zu tun, aber ich habe dabei den Container ausgeführt und dann mit docker exec -it [COINTAINER ID] bin/bash in den Container geschaut und ihn gefunden.
  2. Setzen Sie Java_HOME in dockerfile und bauen Sie alles neu auf

Hier ist das letzte Dockerfile (es sollte mit dem Python-Code in der Frage funktionieren):

### 1. Get Linux
FROM Alpine:3.7

### 2. Get Java via the package manager
RUN apk update \
&& apk upgrade \
&& apk add --no-cache bash \
&& apk add --no-cache --virtual=build-dependencies unzip \
&& apk add --no-cache curl \
&& apk add --no-cache openjdk8-jre

### 3. Get Python, PIP

RUN apk add --no-cache python3 \
&& python3 -m ensurepip \
&& pip3 install --upgrade pip setuptools \
&& rm -r /usr/lib/python*/ensurepip && \
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 && \
rm -r /root/.cache

### Get Flask for the app
RUN pip install --trusted-Host pypi.python.org flask

####
#### OPTIONAL : 4. SET Java_HOME environment variable, uncomment the line below if you need it

#ENV Java_HOME="/usr/lib/jvm/Java-1.8-openjdk"

####

EXPOSE 81    
ADD test.py /
CMD ["python", "test.py"]

Ich bin neu bei Docker, daher ist dies möglicherweise nicht die bestmögliche Lösung. Ich bin offen für Vorschläge. 

4
pajamas

sie sollten ein FROM in Ihrer Docker-Datei haben .__ (sofern Sie nicht mehrstufige Builds für das Docker verwenden) 

1
RELW

Ich glaube, dass Sie durch das Hinzufügen von FROM openjdk:slim line dem Docker mitteilen, dass es alle nachfolgenden Befehle im openjdk-Container (der kein Python hat) ausführen soll.

Ich würde das ansprechen, indem ich zwei separate Container für openjdk und python erstellt und einzelne Befehlssätze dafür spezifiziert.

Docker wurde entwickelt, um Ihre Lösungen zu modularisieren, und es ist in der Regel eine schlechte Praxis, alles in einen Container zu mischen. 

0

Anstatt FROM openjdk:slim zu verwenden, können Sie Java separat installieren. Beachten Sie das folgende Beispiel:

# 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
0
Hemant Singh

Eine einfachere Lösung für das oben genannte Problem besteht darin, mehrstufige Docker-Container zu verwenden, in denen Sie den Inhalt von einem zum anderen kopieren können. Im obigen Fall können Sie openjdk:slim als Basiscontainer und verwenden Sie dann den Inhalt eines python container, der wie folgt in diesen Basiscontainer kopiert werden soll:

FROM openjdk:slim
COPY --from=python:3.6 / /

... 

<normal instructions for python container continues>

...

Diese Funktion ist ab Docker 17.05 verfügbar. Mit der mehrstufigen Erstellung können Sie mehr tun, als nur die benötigten Inhalte von einem zum anderen zu kopieren.

Referenzdokumentation

0
Sunny Pal

Oh, lass mich meine fünf Cent hinzufügen. Ich habe Python Slim als Grundbild genommen. Dann habe ich open-jdk-11 gefunden (Hinweis, open-jdk-10 schlägt fehl, weil es nicht unterstützt wird) Basis-Image-Code! ... und kopierte ihn in meine Docker-Datei. 

Anmerkung, durch Kopieren und Einfügen gesteuerte Entwicklung ist cool ... NUR, wenn Sie jede Zeile verstehen, die Sie in Ihrem Code verwenden !!!

Und hier ist es!

<!-- 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"

Verweist jetzt auf . https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/11/jdk/ubuntu/Dockerfile.hotspot.releases.slim

https://hub.docker.com/_/python/

https://hub.docker.com/r/adoptopenjdk/openjdk11/

Ich habe sie verwendet, um diese Frage zu beantworten, die Ihnen vielleicht irgendwann helfen wird Python und Java in Docker ausführen

0
Yan Khonski