我有一个简单的服务器-客户端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和需要存储库的大型应用程序。
答案 0 :(得分:-1)
首先,WORKDIR
通常应在COPY
操作之前出现。这将设置文件在Docker映像中的默认位置。
但是,在您的示例中,它不会影响COPY
,因为您在其中指定了显式的容器目标目录。也就是说,它确实会影响您随后的javac
命令,因为此处没有完全限定的目录名称。
在新示例中,您可以执行以下操作:
WORKDIR /var/www/java
COPY src src
这会将主机目录中src
的所有内容复制到映像中的/var/www/java/src
。
这应该是最低限度的工作。 Dockerfile倾向于以增量方式构建,因此一旦完成一项工作,便可以进行另一项工作。不要尝试一次做所有事情。
您已表明要在单独的容器中启动服务器和客户端。为此,您可以使用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卷或环境变量来完成此操作(如果您对此感兴趣,那么可能值得将其作为一个单独的问题进行假设,前提是尚未提出该问题)。