Использование среды IDE при разработке в контейнере докеров

Есть что-то, чего я не получаю при разработке приложения при использовании контейнеров docker.

Допустим, я разрабатываю Java-приложение, и я настроил контейнер java с базовым изображением jdk 8, мне все равно нужно установить java 8 jdk на мою локальную машину разработки, так как IDE, которую я собираюсь использовать, будет искать время выполнения библиотеки на локальном компьютере, а не докер-контейнере.

Это правильно или я что-то упускаю? Somethings Я смогу полностью использовать контейнер докеров, например, создать базу данных, но некоторые вещи, которые мне также придется делать на моей локальной машине разработки, и попытаться сопоставить ее с моим файлом докеров, например, языком runtime, например java или python ради использования IDE.

Ответ 1

Обновления:


Исходное сообщение:

Есть кое-что, чего я не получаю при разработке приложения при использовании докер-контейнеров.

Это нормально, это не что-то тривиальное. Попробуйте увидеть общую картину, касающуюся создания конвейера разработки (или конвейера CI/CD, если вы хотите использовать термины непрерывная интеграция/непрерывная доставка).

enter image description here

Это изображение из [2]

Ограничения при настройке локальной среды разработки

Допустим, я занимаюсь разработкой java-приложения и настроил java-контейнер с базовым образом jdk 8, мне все еще нужно установить java 8 jdk на мою локальную машину для разработки, поскольку IDE, которую я собираюсь использовать, будет искать среду выполнения библиотеки на локальной машине не контейнер докера.

Это опция, которая может вызвать у вас уже упомянутую проблему: она может работать в вашей локальной среде разработчика и не работать в другом месте, потому что вы забыли добавить библиотеку, зависимость, небольшое изменение, которое вы сделали, не обращая внимания и не забывая добавить его. в вашу среду докера.

Вы можете придерживаться докера во время разработки

Подход, который решает вышеуказанную проблему, заключается в использовании docker [3] для настройки среды, которую вы хотите использовать. Это означает, что каждый раз, когда вы что-то изменяете, вам придется docker build новый образ в docker run а docker run новый контейнер на основе этого образа. Как уже упоминали другие, для определения того, как будут создаваться ваши изображения, вам придется использовать Dockerfiles. И если ваше приложение имеет разные взаимосвязанные контейнеры, вам придется определить все это (сети, ссылки, зависимости) в файле docker-compose.yml. Повторяющийся процесс сборки и запуска станет вашей работой в IDE...

IDE и плагины/дополнения

из [1]:

IDE

Версии Docker не предоставляют встроенную среду разработки для разработки с Docker. Основным интерфейсом является API командной строки. Однако большинство ведущих IDE (NetBeans, Eclipse, IntelliJ, Visual Studio) имеют некоторую поддержку Docker с помощью плагинов или надстроек.

Например, из [2]:

enter image description here

Docker Labs - Руководства для разработчиков

Вы можете найти некоторые рекомендации в зависимости от вашего случая (IDE, язык...) здесь:

Общие тома | Горячая перезагрузка | "наблюдая" за изменениями файлов

Я думаю, что этот подход совпадает с вашим заголовком "разработка в контейнере Docker", и я имею в виду/понимаю случай, когда у кого-то есть работающий контейнер с общим томом, и всякий раз, когда в коде происходит изменение (с использованием IDE), это влияет на Контейнер напрямую. Может быть, это будет работать для случая и иметь ограничения для некоторых других случаев. Это зависит от вас, чтобы сделать ваши оценки и выбрать свой путь.

Мои источники:

Ответ 2

У вас есть возможность запускать IDE в качестве контейнера докеров, поэтому вам не нужно ничего устанавливать на вашем компьютере.

Для этого вам необходимо:
- докер
- X11
- IDE по вашему выбору.

Взгляните на этот проект java, который запускает java8 и выравнивается внутри IntelliJ IDE:

https://github.com/marioluan/java-data-structures

Настройка довольно проста:

Dockerfile

FROM openjdk:8-jdk-alpine

# ttf-dejavu is required to render GUI under X11: https://github.com/docker-library/openjdk/issues/73
RUN apk --update add --no-cache ttf-dejavu

# install intellij
RUN wget -O /tmp/idea.tar.gz https://download-cf.jetbrains.com/idea/ideaIC-2017.3.4.tar.gz \
    && mkdir -p /usr/share/intellij \
    && tar -xf /tmp/idea.tar.gz --strip-components=1 -C /usr/share/intellij \
    && rm /tmp/idea.tar.gz

докер-compose.yml

version: '3'
services:
  intellij:
    build: .
    environment:
      - DISPLAY=$DISPLAY
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix
      - /your/workspace:/tmp/your/workspace
      - idea_cache:/root/.IdeaIC2017.3
      - java_cache:/root/.java
    working_dir: $APP_ROOT
    command: /usr/share/intellij/bin/idea.sh
volumes:
  idea_cache:
  java_cache:

Ответ 3

Я чувствую твою боль. Разработка проектов с несколькими библиотечными зависимостями может сделать процесс строительства намного более трудоемким, при каждом изменении. Это может расстраивать.

К счастью, вы можете исправить эту проблему, написав DockerFile, используя maven-docker-plugin https://github.com/spotify/docker-maven-plugin.

Это позволит сэкономить использование уже зависимых библиотек, доступных на вашем хосте.

В качестве примера у меня есть запрос на перенос, открытый в репозитории с открытым исходным кодом: https://github.com/iotaledger/iri/pull/481/files