如何为具有多个存储库的IntelliJ项目编写Dockerfile?

时间:2019-08-03 14:22:55

标签: java docker intellij-idea dockerfile

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

当前,我可以通过在IntelliJ IDEA上简单地使用“ compile”和“ build”选项在本地计算机上运行应用程序,但不知道如何将其打包到Docker映像中。

我最近才开始使用IntelliJ和Docker,所以我对这两者都不了解太多。到目前为止,我只设法对一个简单的HelloWorld应用程序进行了Dockerize。不确定这是否重要,但是我在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和需要存储库的大型应用程序。

1 个答案:

答案 0 :(得分:-1)

将文件复制到容器中

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

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

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

WORKDIR /var/www/java  
COPY src src

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

这应该是最低限度的工作。 Dockerfile倾向于以增量方式构建,因此一旦完成一项工作,便可以进行另一项工作。不要尝试一次做所有事情。

Docker Compose

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