Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对tomcat应用程序进行Dockerize_Java_Tomcat_Docker_Dockerfile - Fatal编程技术网

Java 如何对tomcat应用程序进行Dockerize

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 -

我正在尝试对一些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 -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
    ,然后只需执行
    复制应用程序即可