Dockerfile не может скопировать указанный локальный каталог и файл

#java #docker #anaconda #databricks #databricks-connect

#java #docker #anaconda #databricks #databricks-подключение

Вопрос:

Много раз пытался заставить его работать, но поскольку я не могу, мне пришлось отправить запрос на SO, чтобы прояснить его.

Итак, у меня есть следующая структура проекта, для которой я хочу создать dockerfile.

введите описание изображения здесь

Как вы можете видеть из приведенной выше структуры проекта, у меня есть 2 файла, о которых я беспокоюсь. Банки внутри библиотеки и file .databricks-connect

По сути, это файлы, созданные после настройки databricks-connect с помощью команды databricks-connect в моей локальной системе.Поскольку это интерактивный процесс, мы не можем имитировать его в контейнере docker, поэтому я хочу скопировать все свои конфигурации как готовые к использованию внутри docker.

Ниже приведен мой Dockerfile. (Я довольно новичок в docker, поэтому подозреваю, что моя проблема может быть тривиальной)

 FROM ubuntu:18.04

# System packages
RUN apt-get update amp;amp; 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 amp;amp; 
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 возникает ошибка: последняя версия. —нет кэша

 => 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 также завершилась ошибкой с той же ошибкой, что и выше, т. Е. Не удалось найти файл.

Еще одна вещь, которую я пробовал, это то, что, поскольку я КОПИРУЮ . /app, я ожидал, что все файлы, включая библиотеки и .databricks-connect, уже находятся внутри контекста docker в /app, поэтому я попытался сделать

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

Но это также не удалось с другой ошибкой. Приведенная выше команда добавлялась к ENTRYPOINT. Не знаю почему.

Каков наилучший способ монтировать нижеприведенные файлы в контейнер docker во время сборки, чтобы контейнер в целом можно было использовать с compose. Эти файлы необходимы во время выполнения, поэтому без этих файлов точка входа завершится с ошибкой.

Любая помощь будет очень признательна.

Заранее спасибо.

Ответ №1:

Мне сложно дать такой ответ (я думаю), поскольку dockerfile включает в себя две разные точки входа, то есть другую сборку python, о которой я понятия не имею (т. Е. Какая точка входа должна быть выполнена первой). Так что просто примите это как ссылку в любом случае.

Обычной практикой является создание образа из java-проекта после того, как весь проект будет упакован в один блок (.war / ja r), где находятся файлы .class . Насколько я понимаю, docker не перестраивает ваш проект заново (больше похоже на просто развертывание или запуск самого .war / ja r) в контейнере docker. Возможно, я ошибаюсь. Поэтому, возможно, лучше сначала упаковать проект Java.

Здесь один парень из devops использовал необычный (возможно, его обычный) подход, который в основном извлекал эти папки lib, class и META-INF вместе с их содержимым в отдельную папку, которая является AProject / target / dependecy. На случай, если вам интересно, целевая папка является местоположением по умолчанию для сгенерированной .war/jar в Eclipse IDE, так что он получил в основном :

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

Затем его сборка docker :

 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 ) и, наконец, изображение построено.