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.
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:
OPTIONAL: Suchen und setzen Sie Java_HOME
docker exec -it [COINTAINER ID] bin/bash
in den Container geschaut und ihn gefunden.Java_HOME
in dockerfile und bauen Sie alles neu aufHier 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.
sie sollten ein FROM in Ihrer Docker-Datei haben .__ (sofern Sie nicht mehrstufige Builds für das Docker verwenden)
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.
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
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.
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