java - 如何为具有多个存储库的 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 和需要存储库的大型应用程序。
解决方案
将文件复制到容器中
首先,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 卷或环境变量来完成(如果您对此感兴趣,那么可能值得将其作为一个单独的问题提出,假设尚未被提出)。
推荐阅读
- python - 如何在 Django 上使用 POST 传递值?
- vba - 如何强制 Application.Volatile 结束或特定工作簿/工作表
- cobalt - 如何将系统语言设置转移到钴
- c++ - 为什么我在声明类对象时无法初始化它?
- c# - 如何设置 bsonDocument 的 id?
- oracle - Oracle 11 主键生成
- javascript - 处理 vuex 中的嵌套/复杂对象
- php - 如何使用 Google QR Code API 通过 PHP 将 QR 图像保存到数据库?
- javascript - NodeJS:为什么在用户注册期间未定义电子邮件?
- matlab - trapz 函数仅适用于有限的 x 范围