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