【问题标题】:Dockerfile can't copy specified local directory & fileDockerfile 无法复制指定的本地目录和文件
【发布时间】:2020-10-16 19:51:31
【问题描述】:

自几天以来尝试了很多使其工作,但因为我无法不得不放弃对 SO 的查询来澄清它。

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

从上面的项目结构中可以看出,我有 2 个我关心的文件。 lib 中的 jars 和文件 .databricks-connect

这些本质上是我在本地系统上使用命令 databricks-connect 配置 databricks-connect 后生成的文件。由于它是一个交互式过程,我们无法在 docker 容器上模拟它,所以我想要复制我的配置,以便在 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 时出现以下错误。 --no-cache

=> 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 将失败。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

    标签: java docker anaconda databricks databricks-connect


    【解决方案1】:

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

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

    这里有一个人devops stuff 采取了一种不寻常的(也许是常见的)方法,他基本上将那些 lib、class 和 META-INF 文件夹及其内容提取到了一个单独的文件夹中,即 AProject/target/dependecy。如果您想知道 target 文件夹是 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 处于同一级别)并且最终构建图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2021-05-06
      • 2022-09-23
      • 1970-01-01
      • 2021-06-03
      • 2016-01-04
      • 2011-10-14
      相关资源
      最近更新 更多