J'ai besoin de Java et de python dans mon conteneur Docker pour exécuter du code.
Voici mon fichier de dock: Il fonctionne parfaitement si je n’ajoute pas le 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"]
Et l'application test.py se trouve dans le même répertoire:
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)
Je reçois cette erreur:
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.
Qu'est-ce que je fais exactement mal ici? Je suis nouveau au docker, il me manque peut-être une étape.
Détails supplémentaires
Mon but
Je dois exécuter un programme python qui exécute un fichier Java. La bibliothèque python que j'utilise nécessite le chemin d'accès à Java_HOME
.
Mes problèmes:
Je ne connais pas Java, je ne peux donc pas exécuter le fichier correctement.
Tout mon code est en Python, sauf ce bit Java
Le wrapper Python exécute le fichier de la manière dont j'ai besoin de le faire.
OK, il m'a fallu un peu de temps pour le comprendre. Et mes remerciements vont à cette réponse .
Je pense que mon approche n'a pas fonctionné car je n'avais pas de version de base de Linux.
Donc ça va comme ça:
FACULTATIF: recherche et définit Java_HOME
docker exec -it [COINTAINER ID] bin/bash
et je l'ai trouvé.Java_HOME
dans dockerfile et construisez + exécutez tout à nouveauVoici le fichier final Dockerfile (il devrait fonctionner avec le code python de la question):
### 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"]
Docker étant nouveau pour moi, il se peut que ce ne soit pas la meilleure solution possible. Je suis ouvert aux suggestions.
vous devriez avoir un FROM dans votre fichier docker (sauf si vous utilisez une construction en plusieurs étapes pour le docker)
Je crois qu'en ajoutant la ligne FROM openjdk:slim
, vous dites à docker d'exécuter toutes vos commandes ultérieures dans le conteneur openjdk (qui n'a pas de python)
J'aborderais ceci en créant deux conteneurs distincts pour openjdk et python et en spécifiant des ensembles individuels de commandes.
Docker est conçu pour modulariser vos solutions et tout réduire en un seul conteneur est généralement une mauvaise pratique.
Au lieu d'utiliser FROM openjdk:slim
, vous pouvez installer Java séparément, veuillez vous reporter à l'exemple ci-dessous:
# 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
Oh, laissez-moi ajouter mes cinq cents. J'ai pris python slim comme image de base. Ensuite, j'ai trouvé open-jdk-11 (remarque, open-jdk-10 échouera car il n'est pas pris en charge) du code de l'image de base! ... et copié-collé dans mon fichier de docker.
_ {Note, développement piloté par copier-coller} _ c'est cool ... SEULEMENT quand vous comprenez chaque ligne que vous utilisez dans votre code !!!
Et le voici!
<!-- 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"
Maintenant références . 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/
Je les ai utilisés pour répondre à cette question, ce qui peut parfois vous aider . Exécuter Python et Java dans Docker