gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:01:31 25 4
gpt4 key购买 nike

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

最佳答案

将文件复制到容器中

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

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

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

WORKDIR /var/www/java  
COPY src src

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

这应该是最低限度的工作。 Dockerfile 往往是增量构建的,因此一旦你完成一件事,你就可以处理另一件事。不要试图一次完成所有事情。

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 文件,以便您可以在持续集成下构建容器。为此,您需要注入(inject)私钥,然后从 Git 等中提取;这可以使用 Docker 卷或环境变量来完成(如果您对此感兴趣,那么可能值得将其作为一个单独的问题提出,假设尚未提出)。

关于java - 如何为具有多个存储库的 IntelliJ 项目编写 Dockerfile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57339175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com