web-dev-qa-db-fra.com

Comment exécuter Docker avec Python et Java?

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.

3
pajamas

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:

  1. Obtenir Linux (j'utilise Alpine parce que ce sont des barebones)
  2. Obtenir Java via le gestionnaire de paquets
  3. Obtenez Python, PIP

FACULTATIF: recherche et définit Java_HOME

  1. Recherchez le chemin d'accès à Java_HOME. Peut-être y a-t-il une meilleure façon de faire cela, mais je l'ai fait en exécutant le conteneur, puis j'ai regardé l'intérieur du conteneur en utilisant docker exec -it [COINTAINER ID] bin/bash et je l'ai trouvé.
  2. Définissez Java_HOME dans dockerfile et construisez + exécutez tout à nouveau

Voici 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. 

4
pajamas

vous devriez avoir un FROM dans votre fichier docker (sauf si vous utilisez une construction en plusieurs étapes pour le docker) 

1
RELW

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. 

0
Simas Joneliunas

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

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

0
Yan Khonski