如何用 python 和 Java 运行 Docker?

新手上路,请多包涵

我的 docker 容器中需要 java 和 python 来运行一些代码。

这是我的 dockerfile:如果我不添加 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"]

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)

我收到此错误:

 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.

我到底做错了什么?我是码头工人的新手,也许我错过了一步。

额外细节

我的目标

我必须运行一个运行 Java 文件的 python 程序。我正在使用的 python 库需要指向 JAVA_HOME 的路径。

我的问题:

  • 我不懂 Java,所以我无法正确运行该文件。

  • 我的整个代码都在 Python 中,除了这个 Java 位

  • Python 包装器以我需要的方式运行文件。

原文由 pajamas 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 776
2 个回答

好的,我花了一点时间才弄明白。我要感谢这个 答案

我认为我的方法行不通,因为我没有基本版本的 Linux。

所以它是这样的:

  1. 获取 Linux(我正在使用 Alpine,因为它是准系统)
  2. 通过包管理器获取 Java
  3. 获取 Python、PIP

可选:查找并设置 JAVA_HOME

  1. 找到 JAVA_HOME 的路径。也许有更好的方法来做到这一点,但我是在运行容器时这样做的,然后我使用 docker exec -it [COINTAINER ID] bin/bash 查看容器内部并找到它。
  2. 在 dockerfile 中设置 JAVA_HOME 并构建 + 再次运行它

这是最终的 Dockerfile(它应该与问题中的 python 代码一起使用):

 ### 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 的新手,所以这可能不是最好的解决方案。我愿意接受建议。

更新:常见问题

  • 使用python包有困难

正如 Joabe Lucena这里 指出的那样,Alpine 可能会遇到某些 python 包的问题。我建议您使用最适合您的 Linux 发行版,例如 centos。

原文由 pajamas 发布,翻译遵循 CC BY-SA 4.0 许可协议

解决上述问题的一个更简单的方法是使用多阶段 docker 容器,您可以在其中将内容从一个容器复制到另一个容器。在上述情况下,您可以将 openjdk:slim 作为基础容器,然后使用 python 容器中的内容复制到该基础容器中,如下所示:

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

...

<normal instructions for python container continues>

...

此功能从 Docker 17.05 开始可用,并且您可以使用多阶段构建执行更多操作,例如仅将您需要的内容从一个复制到另一个。

参考文档

原文由 Sunny Pal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题