如何解决是否可以在IntelliJ中自动生成Dockerfile和其他部署工具? 配置
我正在探索使用Docker容器化基于Tomcat的Java项目的初始步骤。使用IntelliJ作为我的首选IDE,我已经成功:
- 编写了概念证明Servlet;
- 设置构件来创建最终的WAR;
- 使用IntelliJ Docker插件和官方的Tomcat Docker映像之一,设置一个容器配置,其中将WAR内容作为其安装点之一;
- 通过IntelliJ在本地将容器部署到Docker,并确认我可以通过本地浏览器成功访问Servlet。
因此,在基本开发周期方面,我已经启动并运行。
但是当我最终进行外部部署时(甚至在开发过程中的某个时候),我将需要添加库和资源并生成一个真正独立的容器:换句话说,我将需要从IntelliJ插件当前正在执行的简单部署是将“带有安装点的映像”配置为具有完整的Dockerfile,并指定所有相关配置,包括有效地将我的安装转换为指令以复制到相关内容中。
现在我的问题是:人们通常如何实现这一目标? IntelliJ中是否内置工具可以对此提供帮助?在IntelliJ的容器部署配置设置中(指定了安装点,基本映像等),似乎没有配置复制资源的选项(例如,“复制到独立容器而不是复制到独立容器中,从主机FS安装”)。我是否在某处缺少工具/选项,或者Docker文件的脚本本质上是手动过程?还是我只是用我的整个方法吠叫了错误的树?对于人们通常用于此过程的任何建议,我将不胜感激!
解决方法
Google的臂架
我认为,Jib将为您提供所需的东西。它还提供了Maven和Gradle的插件,并且可以通过“运行/调试配置”在IntelliJ中触发相应的插件(请参见底部的示例)。
Jib无需Docker守护程序即可为Java应用程序构建优化的Docker和OCI映像-无需深入掌握Docker最佳实践。它可以作为Maven和Gradle的插件以及Java库使用。
Jib处理将应用程序打包为容器映像的所有步骤。您无需了解创建Dockerfile的最佳实践或安装Docker。 Jib将您的应用程序组织为不同的层;依赖关系,资源和类;并利用Docker映像层缓存通过仅重建更改来保持快速构建。 Jib的图层组织和小的基础图像使整个图像尺寸变小,从而提高了性能和可移植性。
配置
您可以检查文档。它包含有关创建和部署Docker映像的不同类型配置选项的大量信息。您还可以在其中简单地使用环境变量。
-
对于使用Maven的项目: https://github.com/GoogleContainerTools/jib/tree/master/jib-maven-plugin
-
对于具有Gradle的项目: https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin
- 与Maven相同的选项
关于您的问题,请检查以下部分,例如:adding Arbitrary Files to the Image
在IntelliJ的容器部署配置设置中(指定了安装点,基本映像等),似乎没有配置复制资源的选项(例如,“复制到独立副本”的选项容器而不是从主机FS挂载”)。
演示
出于演示目的,我使用Maven创建了一个简单项目,在其中我还使用了基础图像tomcat:9.0.36-jdk8-openjdk
,该图像也是可选的-参见Jib WAR Projects:
Servlet:
@WebServlet(urlPatterns = {"/hello-world"})
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("Hello World");
}
}
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mvn-jib-example</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>servlet-hello-world</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>2.5.0</version>
<configuration>
<allowInsecureRegistries>true</allowInsecureRegistries>
<from>
<image>tomcat:9.0.36-jdk8-openjdk</image>
</from>
<to>
<image>registry.localhost/hello-world</image>
<auth>
<username>registry_username</username>
<password>registry_password</password>
</auth>
<tags>
<tag>latest</tag>
</tags>
</to>
<container>
<appRoot>/usr/local/tomcat/webapps/ROOT</appRoot>
</container>
<extraDirectories>
<paths>
<path>
<from>./src/main/resources/extra-stuff</from>
<into>/path/in/docker/image/extra-stuff</into>
</path>
<path>
<from>/absolute/path/to/other/stuff</from>
<into>/path/in/docker/image/other-stuff</into>
</path>
</paths>
</extraDirectories>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 执行以下目标将即时创建docker映像:
mvn clean package jib:dockerBuild
- 确认图像已创建:
docker image ls
- 从图像启动容器
docker run --rm -p 8082:8080 registry.localhost/hello-world:latest
结果:
部署
要将映像部署到外部Docker注册表,您可以查看以下部分:
IDE
最后但并非最不重要的一点,由于您正在使用IntellIJ IDEA,因此您可以简单地创建RUN / Debug配置以通过按钮(例如,通过一种用于构建映像的配置,一种用于将其部署到localhost的配置,一种用于部署到外部注册表的配置,等等。
以下是maven(see)的示例:
,我现在正在执行的项目使用的是Spring-boot,它实际上已在其中嵌入了Tomcat。我使用Docker Gradle插件(https://plugins.gradle.org/plugin/com.bmuschko.docker-spring-boot-application)来构建并将Docker映像推送到注册表,该注册表可以是Docker Hub或AWS ECR。该组合与IntelliJ配合良好,因为它还是Gradle任务。
由于它是Spring-boot,因此该插件可以在最低配置下基于任何基本JRE映像(我使用https://hub.docker.com/_/adoptopenjdk)构建映像。完全不需要编写自己的Dockerfile。
docker {
def registryHost = 'xxx.dkr.ecr.us-west-2.amazonaws.com'
springBootApplication {
baseImage = "${registryHost}/caelus:springboot-jdk14-openj9"
images = ["${registryHost}/caelus:app"]
ports = [8080,8081]
jvmArgs =['-Djdk.httpclient.allowRestrictedHeaders=content-length']
}
}
,
我建议这些问题:
- How to use docker in the development phase of a devops life cycle?
- How to deploy java application in a cloud instance from the scratch to an advanced architecture?
- What code-repository should the Dockerfile get committed to?
作为总结,IntelliJ,Eclipse,VStudio只是IDE,因此不是在实际环境中进行部署的选项。
如果您要谈论外部部署,则需要一个站点来存储docker映像,并至少需要一个连续集成服务器(Jenkins,Travis,Bamboo,Circle CI,buddy.works)
基本流量
- 建筑师,系统管理员,高级开发人员或具有基础设施技能的人员,必须创建Dockerfile和其他所需文件。
- 开发人员无需担心docker,卷,端口等。开发人员只需开发代码(在您的情况下为Java)。
- 开发人员执行git push
- 您的持续集成服务器检测到此事件并开始docker build...。
- 在构建Docker(持续集成服务器)之后,将新创建的docker映像推送到您的Docker Hub存储库
- 使用一些配置,您的连续集成服务器可以知道需要进行部署的位置(如您所说的外部部署)。下一个经典环境可能是示例:测试或暂存。在这种情况下,部署只是下载所请求的Docker映像。
- 如果有质量保证团队和自动化测试,请确保一切正常,您的持续集成服务器将执行最后一步:在生产环境中部署docker映像,或者像我所说的那样,仅下载docker映像。
您的问题
Docker文件的脚本本质上是手动过程吗?
正如我所解释的,Dockerfile是所有基础。如果您需要手术或者像这样的工匠,那么它的创建是手动的,有趣的或具有挑战性的:
- 容器启动时的tomcat用户配置
- tomcat高级变量配置
- 任何需要人工但要使其自动化的高级tomcat配置。
tomcat / webapps内部的Java战争是非常常见的要求,因此您会发现很多Dockerfile,或者如果满足您的要求,则可以使用IntelliJ生成的生成文件。
如果找不到适合Java应用的Dockerfile,请随时与我联系。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。