3

几天以来,我做了很多尝试让它工作,但因为我不能不得不放弃对 SO 的查询来澄清它。

所以,我已经关注了我想要为其构建 dockerfile 的项目结构。

在此处输入图像描述

正如您从上面的项目结构中看到的那样,我有 2 个我关心的文件。lib中的jar和文件.databricks -connect

这些本质上是我在本地系统上使用命令databricks-connect配置 databricks-connect 后生成的文件。由于它是一个交互式过程,我们无法在 docker 容器上模拟它,所以我想复制我的配置以供在内部使用码头工人。

下面是我的 Dockerfile。(我对码头工人很陌生,因此我怀疑我的问题可能是微不足道的)

FROM ubuntu:18.04

# System packages
RUN apt-get update && apt-get install -y curl

# Install miniconda to /miniconda
RUN curl -LO http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
RUN bash Miniconda3-latest-Linux-x86_64.sh -p /miniconda -b
RUN rm Miniconda3-latest-Linux-x86_64.sh
ENV PATH=/miniconda/bin:${PATH}
RUN conda update -y conda

RUN apt-get update && \
apt-get install -y openjdk-8-jdk openjdk-8-jre

# Define working directory.
WORKDIR /app

# Define commonly used JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV JRE_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre

COPY . /app

RUN conda create -n snowflake-graphdb python=3.7

ENV PATH /miniconda/bin:$PATH

# Activate the environment, and make sure it's activated:
RUN ["conda", "run", "-n", "snowflake-graphdb", "pip", "install", "-r", "requirements.txt"]

#COPY .databricks-connect /root
RUN ls -a
RUN "mkdir /miniconda/envs/snowflake-graphdb/lib/python3.7/site-packages/pyspark/jars"
COPY libs/  /miniconda/envs/snowflake-graphdb/lib/python3.7/site-packages/pyspark/jars/
RUN "touch /root/.databricks-connect"
RUN "cat /app/databricks-connect.txt > /root/.databricks-connect"

WORKDIR /app
ENV PYTHONPATH "${PYTHONPATH}://app/src/main/python"
ENTRYPOINT ["conda", "run", "-n", "snowflake-graphdb", "databricks-connect", "test"]
#ENTRYPOINT ["conda", "run", "-n", "snowflake-graphdb", "python", "/app/src/main/python/server/GraphTransformerServer.py"]
EXPOSE 1020

以下是我运行docker built -t graphtransformer:latest 时的错误。--无缓存

=> ERROR [14/17] COPY libs/  /miniconda/envs/snowflake-graphdb/lib/python3.7/site-packages/pyspark/jars/                                                                                                                         
------
> [14/17] COPY libs/  /miniconda/envs/snowflake-graphdb/lib/python3.7/site-packages/pyspark/jars/:
------
failed to solve with frontend dockerfile.v0: failed to build LLB: failed to compute cache key: "/libs" not found: not found

我尝试了其他目录,例如docs等,但看起来除了src什么都不能读取。因此,我将/libs移动到src/main/libs以欺骗系统也将其拾取(在 .gitignore 中添加了条目以忽略文件),但它也没有从src/main/libs中选择。此外,命令COPY .databricks-connect /root也因与上述相同的错误而失败,即无法找到文件。

我尝试的另一件事是,因为我做了 COPY 。/app我希望包括libs 和 .databricks-connect在内的所有文件都已经在/app下的 docker 上下文中,所以我尝试这样做

CMD "cp /app/libs/* /miniconda/envs/snowflake-graphdb/lib/python3.7/site-packages/pyspark/jars && cat /app/databricks-connect.txt > /root/.databricks-connect"

但这也因不同的错误而失败。上面的命令被附加到 ENTRYPOINT。不知道为什么。

在构建期间将波纹管文件挂载到 docker 容器中的最佳方法是什么,以便整个容器可以与 compose 一起使用。在 RUNTIME 期间需要这些文件,因此如果没有这些文件,ENTRYPOINT 将失败。

任何帮助将不胜感激。

提前致谢。

4

1 回答 1

0

我很难给出这样的答案(我认为),因为 dockerfile 涉及两个不同的入口点,这是我不知道的另一个 python 构建(即应该首先执行哪个入口点)。所以还是把这个作为参考吧。

在整个项目本身被打包到一个.class文件所在的单元 ( .war/ jar)之后,从 java 项目构建图像是一种常见的做法。据我了解,docker不会在docker 容器内再次重建您的项目(更像是部署或运行​​ .war/jar本身)。不过我可能是错的。所以最好先打包java项目。

有一个人在这里devops采取了一种不寻常的(也许是常见的)方法,基本上他将那些 lib、class 和 META-INF 文件夹连同它们的内容一起提取到一个单独的文件夹中,即 AProject/target/dependecy。如果您想知道目标文件夹是 Eclipse IDE 中生成的默认位置,.war/jar那么他基本上得到了什么:

 target/dependency/lib
  target/dependency/classes
  target/dependency/META-INF 

然后他的 docker build :

ARG DEPENDENCY=target/dependency
    COPY ${DEPENDENCY}/lib /app/lib
    COPY ${DEPENDENCY}/META-INF /app/META-INF
    COPY ${DEPENDENCY}/classes /app
  ENTRYPOINT ["java", "-cp", "app:app/lib/*","com.javapointers.Application"]

在这种情况下,dockerfile 的位置直接在项目中(与pom.xml处于同一级别)并且最终图像被构建。

于 2020-10-17T04:04:49.410 回答