Java 如何对tomcat应用程序进行Dockerize
我正在尝试对一些Tomcat应用程序进行dockerize,但我以前从未接触过Java应用程序,因此缺乏对它的理解使我很难理解我应该做什么 到目前为止,我有这个,但它不工作,我不知道它是否是正确的路径以及Java 如何对tomcat应用程序进行Dockerize,java,tomcat,docker,dockerfile,Java,Tomcat,Docker,Dockerfile,我正在尝试对一些Tomcat应用程序进行dockerize,但我以前从未接触过Java应用程序,因此缺乏对它的理解使我很难理解我应该做什么 到目前为止,我有这个,但它不工作,我不知道它是否是正确的路径以及 FROM tomcat:6 ENV APP_ROOT /app_name RUN apt-get update && apt-get install -y default-jdk COPY . $APP_ROOT/ WORKDIR $APP_ROOT RUN jar -
FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk
COPY . $APP_ROOT/
WORKDIR $APP_ROOT
RUN jar -cvf app_name.war *
# this fail for some reason, when I do `ls` the file is there but if fail to copy it
COPY app_name.war $CATALINA_BASE/webapps/app_name.war
我只是在重复这个问题,因为我不明白,谷歌搜索也帮不了我那么多(我不知道怎么问)
我应该在构建中使用jar
命令吗?如果没有,我想我必须在本地构建它,并确保.war
正确吗
使用Tomcat应用程序构建Java是如何工作的?如何与Docker集成
抱歉说得太笼统了,但我对Java一无所知。我不使用docker,我使用类似的AWS产品codedeploy进行资源调配实例,所以我在资源调配脚本中为Tomcat设置做了些什么。应该很容易移植到docker,就像bash comands一样 1)发动战争 现在大多数java应用程序都是使用Maven构建的,但Gradle正在迎头赶上。Maven和WAR插件用于将java代码转换为WAR文件,您可以将其部署到Tomcat上。但看起来你已经有了别人制造的战争?不管怎样,你都不会直接运行war,而是把它放在Tomcat中,除非你已经将Tomcat捆绑到应用程序中,在这种情况下,它将是一个JAR,但我们不要谈论这个……简单的解决方案是使用Maven或Gradle等构建工具从java代码构建war。所谓构建,我的意思是将其从源代码转换为二进制代码 2)安装Tomcat yum安装tomcat6、7、8等(以您需要的版本为准) 然后打开它 服务启动tomcat8 3)部署战争 要运行war,请将其放在Tomcat安装的webapps文件夹中。我通常喜欢在我这样做的时候关闭tomcat,但是你可以在它运行的时候关闭它。几秒钟后,WAR(实际上只是一个zip文件)将被分解/解压缩以创建一个目录 4)访问应用程序/站点 如果您将war重命名为ROOT.war,那么如果您的配置是让它在8080上侦听,则可以在访问应用程序。如果您的war名称为pets.war,则您的Web应用程序URL将为。您可以在conf文件夹中的server.xml文件中配置Tomcat要侦听的端口 最重要的
一旦您知道要查找什么,Tomcat文档就非常好了。主要配置文件是web.xml、context.xml和server.xml。中心tomcat指南解释了您只需找到与您的tomcat版本对应的文档所需的每个组件。查看您的代码,这就是我所能看到的:
- 您在当前目录中存储了一些java文件(
) - 当您调用
时,您将所有这些内容复制到COPY
/app\u name
- 您可以在文件上创建一个
.war
app\u name.war
不在主机磁盘上,它当前位于docker文件系统中。这意味着您不能复制.war
你真正想要的是:运行cp-app\u-name.war$CATALINA\u-BASE/webapps/app\u-name.war
如下所示:
Dockerfile
FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk
COPY . $APP_ROOT/
WORKDIR $APP_ROOT
RUN jar -cvf app_name.war *
RUN cp app_name.war $CATALINA_BASE/webapps/app_name.war
FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk
COPY app_name.war $CATALINA_BASE/webapps/app_name.war
WORKDIR $APP_ROOT
在这里添加docker引用,因为它详细解释了命令。编写一个名为provision.sh
的脚本,然后执行以下操作,这可能对您有所帮助:
COPY provision.sh /tmp/provision.sh
RUN sh /tmp/provision.sh
通过这种方式,您可以将所有的构建、配置和其他功能放在一个脚本中,您可以在本地进行测试(如果有帮助的话,也可以这样做)
编辑:添加关于本地构建和复制到dockerfile的说明
您可以在您的计算机上构建.war
,使用COPY
将信息放到计算机上。
Dockerfile
FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk
COPY . $APP_ROOT/
WORKDIR $APP_ROOT
RUN jar -cvf app_name.war *
RUN cp app_name.war $CATALINA_BASE/webapps/app_name.war
FROM tomcat:6
ENV APP_ROOT /app_name
RUN apt-get update && apt-get install -y default-jdk
COPY app_name.war $CATALINA_BASE/webapps/app_name.war
WORKDIR $APP_ROOT
上面复制了文件app\u name.war
,然后将其添加到容器的文件系统中,路径为$CATALINA\u BASE/webapps/app\u name.war
。因此,您可以这样做:
使用java在您的机器上构建.war
将.war
放入带有Dockerfile
将app\u name.war复制到容器的文件系统中
在尝试自动化之前,您可以尝试“手动”完成此操作,这有助于理解流程。您不需要扩展tomcat官方映像就可以在Docked tomcat上部署war,如果您不需要自定义权限和用户(在生产中,您需要),您可以直接使用映像
如果您的webapp实现servlet API<3而需要Tomcat 6.x,请执行以下操作:
sudo docker run --name tomcat --detach --port 8080:8080 tomcat:6
现在,您的Tomcat正在后台运行(--detach),等待部署。您已从容器中导出端口8080,并将其映射到主机中的端口8080,因此应用程序将在主机上的上可用
从现在起,如果将/usr/local/tomcat/webapps中的.war复制到容器中,则将部署该应用程序:
sudo docker cp app_name.war tomcat:/usr/local/tomcat/webapps/
$CATALINA_BASE
不是Dockerfile中的环境变量,是吗?而且,tomcat 6真的很老了……到目前为止,您所做的只是配置,将CMD和ENTRYPOINT作为Dockerfile@cricket_007$CATALINA_BASE
来自tomcat BASE映像。我对tomcat版本无能为力:(@user2915097是的,我甚至不能通过,所以我甚至不能运行这个应用程序,我必须执行CMD[“catalina.sh”,“run”]
如果我没有弄错的话。这就是我构建它的正确路径吗?这是有道理的,这解释了为什么我不能复制它。我会试试这个。我应该继续在我的构建中进行.war吗?我不想让人们理解Java是如何工作的,所以这就是为什么我不想只装载卷。你可以用几种方法来实现,你可以(1)在外部构建.war
,然后只需执行复制应用程序即可