【问题标题】:How to write the Dockerfile for an IntelliJ project with multiple repositories?如何为具有多个存储库的 IntelliJ 项目编写 Dockerfile?
【发布时间】:2019-08-03 14:22:55
【问题描述】:

我有一个简单的服务器-客户端 Java 应用程序,其中客户端可以连接到服务器并发送/接收消息。该应用程序是一个使用 IntelliJ 构建的项目,其中包含多个存储库和 Java 文件。我需要在 Docker 上运行应用程序,但不知道如何构建映像。

目前,我可以在我的机器上本地运行应用程序,只需使用 IntelliJ IDEA 上的“编译”和“构建”选项,但不知道如何将其打包到 Docker 映像中。

我最近才开始使用 IntelliJ 和 Docker,所以我对这两者都没有太多经验。到目前为止,我只设法 Dockerize 一个简单的 HelloWorld 应用程序。不确定这是否重要,但我在 Java 方面的经验也可以忽略不计。这个任务的目的是学习 Docker,而不是 Java。

我为我的 HelloWorld 应用程序使用了以下 Dockerfile,它非常简单,因为它在一个文件夹中只有一个文件。

FROM java:8
COPY . /var/www/java  
WORKDIR /var/www/java  
RUN javac HelloWorld.java  
CMD ["java", "HelloWorld"]

我想知道如何为我的整个项目做同样的事情。对于上下文,我的服务器应用程序的 src 文件夹中有 3 个文件:“Main.java”、“Server.java”和“ServerThread”。我需要在一个容器中运行服务器应用程序,而在单独的容器中运行客户端应用程序。 Dockerfile 应该构建在 src 文件夹中还是根文件夹中。对于一个简单的 HelloWorld 应用程序,它应该与 Dockerfile 有多大不同?我应该将run 命令与哪些文件一起使用?

我对此感到不知所措,因为这是我第一次使用 Docker 和需要存储库的大型应用程序。

【问题讨论】:

  • 感谢您的回复!不,我的客户端和服务器将内置到单独的图像/容器中。
  • 听起来是一个很好的机会,可以拆分为 2 个 intellij 项目,每个项目都有自己的 dockerfile。一个 intellij 项目的多个存储库对我来说听起来过于复杂。
  • @halfer 我将在同一台机器上运行客户端和服务器容器,但最终想让它们联机。
  • @vikingsteve 服务器和客户端项目已经是 2 个独立的 IntelliJ 项目。我的意思是它们进一步包含更多文件夹。我的描述在这里可能有点误导。如上所述,有一个包含 3 个文件的 src 文件夹。除此之外,还有名为 .ideaout 的文件夹,其中包含类文件。

标签: java docker intellij-idea dockerfile


【解决方案1】:

将文件复制到容器中

首先,WORKDIR 通常应该出现在COPY 操作之前。这将设置 Docker 映像中文件的默认位置。

但是,在您的示例中,它不会影响COPY,因为您在其中指定了一个明确的容器目标目录。也就是说,它确实会影响您随后的 javac 命令,因为这里没有完全限定的目录名称。

在您的新示例中,您可以执行以下操作:

WORKDIR /var/www/java  
COPY src src

这会将您主机目录中src的所有内容复制到图像中的/var/www/java/src

这应该是最低限度的。 Dockerfiles 往往是增量构建的,所以一旦你让一件事工作,你就可以在另一件事上工作。不要试图一次做所有事情。

Docker 编写

您已表示要在不同的容器中启动服务器和客户端。为此,您可以使用 Docker Compose。这使用了一个简单的 YAML 配置文件。在这个例子中,一个有 Dockerfile,一个使用现有的镜像:

version: "2"
services:
  client:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - BITBUCKET_PRIVATE_KEY
  listener:
    image: listener

DC 的伟大之处在于每个容器都会自动放入虚拟网络 - client 将看到一台名为 listener 的机器(反之亦然)。所以客户端可以连接到http://listener:port

获取存储库

在某些时候,您可能希望从版本控制系统中获取 Java 文件,这样您就可以在持续集成下构建您的容器。为此,您需要注入一个私钥,然后从 Git 等中提取;这可以使用 Docker 卷或环境变量来完成(如果您对此感兴趣,那么可能值得将其作为一个单独的问题提出,假设尚未被提出)。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2023-03-16
    • 2021-06-06
    • 2021-04-29
    • 2012-02-04
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多