首页 > 解决方案 > 如何为具有多个存储库的 IntelliJ 项目编写 Dockerfile?

问题描述

我有一个简单的服务器-客户端 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 和需要存储库的大型应用程序。

标签: javadockerintellij-ideadockerfile

解决方案


将文件复制到容器中

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

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

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

WORKDIR /var/www/java  
COPY src src

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

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

码头工人撰写

您已经表明要在单独的容器中启动服务器和客户端。为此,您可以使用 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 卷或环境变量来完成(如果您对此感兴趣,那么可能值得将其作为一个单独的问题提出,假设尚未被提出)。


推荐阅读