在使用Docker容器进行开发时使用集成开发环境(IDE)

62

在使用docker容器开发应用程序时,有一些问题我没有理解。

比如说,我正在开发一个 Java 应用程序,并设置了一个基于 JDK 8 基础镜像的 Java 容器。但我仍然需要在本地开发机上安装 Java 8 JDK,因为我将使用的 IDE 将查找本地计算机上的运行库,而不是 docker 容器中的运行库。

我的理解正确吗?有些事情我可以完全在 docker 容器中处理,例如设置数据库,但有些事情我也必须在本地开发机上进行,例如为了使用 IDE 而匹配 docker 镜像的语言运行时,如 Java 或 Python。


1
你的本地机器就是你的本地开发环境,对吧?所以,最终一旦你完成了开发,你想要使用容器进行部署? - Vivek Shankar
2
这取决于你的团队将使用多少Docker。 Docker的一个卖点是标准化,以便没有开发人员会说“它在我的机器上运行,为什么在你的机器上不工作?”如果“dev”容器被标准化,并且每个人都使用它,那么每个人的库和工具应该匹配。 - Paul
1
@Shanky 我想在本地机器上开发并在容器中进行测试,就像我开发时更改项目中的文件然后在容器上运行更改一样。 - Hopewell Mutanda
@HopewellMutanda 嗯,我认为你想要兼顾两个方面。容器的理念是,你可以构建自己想要的内容,并在满意后将其封装成容器。至于Java应用程序,如果你在容器内仔细设置了环境,那么应用程序的行为与本地开发环境几乎没有区别的可能性非常小。 - Vivek Shankar
5个回答

23

更新:


原帖:

在使用Docker容器开发应用程序时,我似乎一些东西没有掌握。

没关系,这不是一件微不足道的事情。试着把大局看清楚,这涉及到创建一个开发流水线(或者如果你喜欢使用术语持续集成/持续交付,那就是CI/CD流水线)。

enter image description here

上图来自 [2]

设置本地开发环境时的局限性

假设我正在开发一个Java应用程序,并使用jdk 8基础镜像设置了一个Java容器,我仍然需要在我的本地开发机器上安装Java 8 JDK,因为我将要使用的IDE将在本地机器上查找运行时库而不是Docker容器。

这是一个选项,可能会导致问题:它可以在您的本地开发环境中工作,但在其他地方失败,因为您忘记添加一个库、一个依赖项、一些细微的更改并没有注意到并牢记添加到您的Docker环境中。

您可以在开发过程中坚持使用Docker

解决上述问题的一种方法是依赖于Docker[3],以设置您想要使用的环境。这意味着每次更改内容,您都需要基于此映像docker build一个新的镜像并docker run一个新的容器。正如其他人提到的那样,要定义如何构建您的映像,您将不得不使用Dockerfile。如果您的应用程序有不同的相互连接的容器,则必须在docker-compose.yml文件中定义所有这些(网络、链接、依赖项)。然后构建和运行的重复过程将成为您的IDE的工作...

集成开发环境 & 插件/附加组件

[1] 中提到:

集成开发环境(IDE)

Docker版本没有提供用于Docker开发的本地集成开发环境(IDE)。主要接口是命令行API。然而,大多数主流IDE(NetBeans、Eclipse、IntelliJ、Visual Studio)通过插件或附加组件支持Docker。

例如,[2]中提到:

进入图像描述

Docker实验室-开发人员工具教程

您可以在此处找到一些指南,具体情况取决于您的情况(IDE、语言...):

共享卷|热重载|监听文件更改

我认为这种方法与您的标题"在Docker容器上开发"相符,我的意思是/理解当某人有一个运行中的容器并且共享卷,每当代码发生更改(使用IDE),这会直接影响容器。也许这种方法适用于某些情况,并且对其他情况存在限制。由您来评估并选择您的路径。

我的来源:


22

您可以选择将IDE作为Docker容器运行,因此您不需要在计算机上安装任何内容。

要这样做,您需要:
- Docker
- X11
- 您选择的IDE。

查看此Java项目,它在IntelliJ IDE中运行Java8和Gradle:

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

docker-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:

7
仅仅因为你能做到,并不意味着这是一个好主意。在Docker容器内进行开发引入的熵远远超过它的优点。 - tiagoboldt
1
那就取决于做出选择的人了。 - Mario Souza
1
@tiagoboldt。您能否解释一下“熵由...引入”的含义?因为我认为这个解决方案很好。我想我可能漏掉了什么。 - guettli
@guettli 我不确定tiagoboldt的意思,但我的一般观察是,当您的主机系统是Linux时,这是一个非常好的想法,但是当您的主机系统是Mac或更糟的Windows时,您实际上正在运行Linux虚拟机上的Docker,而且您的X11很差。它对于某些事情来说还可以,但对于运行GUI应用程序容器来说,它是令人不快的。 - emory

2
你需要一个工具,实现开发容器的概念,其中你的本地(或可选的云端)IDE连接到一个Docker容器,提供你的开发环境。我最近写了一篇博客文章来解释这个概念,并画了一个草图来说明它:

dev-container-concept-drawing

IDE(集成开发环境)已经实现了这个概念:


0

我能感受到你的痛苦。在开发有多个库依赖的项目时,每次进行更改都会使构建过程变得更加耗时。这可能会让人感到沮丧。

幸运的是,您可以通过使用 maven-docker-plugin https://github.com/spotify/docker-maven-plugin 来编写您的 DockerFile 来解决这个问题。

这将节省使用您主机上已有的库依赖。

例如,我在一个开源仓库中打开了一个拉取请求,请参见此处:https://github.com/iotaledger/iri/pull/481/files


1
他们想避免在主机上安装库,而不是在Docker中重复使用它们。 - Mario Souza

0

实际上,在主机上根本不需要本地语言运行时

要这样工作,您需要使用特定的CLI工具,例如该工具或任何类似的https://github.com/dsboxteam/dsb

它是专门为在使用Docker容器时简化IDE中的本地开发而制作的

在切换到容器时,当前工作目录和子命令参数中的完整文件路径将映射到相应容器的路径(如果可能),以及来自主机机器的当前用户和权限。

此外,该工具支持通过特殊的主机脚本在容器中执行命令,这些脚本与原始命令的调用方式相同 - 只是在特殊前缀下。

这使您可以几乎像直接在主机系统中一样在容器中运行命令,并提供与IDE设置的无缝集成


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接