来自主机的 Postman 请求无法到达在 Docker 容器上运行的 Tomcat 服务器

问题描述 投票:0回答:1

我正在开发一个 java servlet REST Api 项目GitHub Repo,我决定为该项目创建一个 Docker 映像,我可以轻松地将其部署到某个云平台,或者发布到某个容器注册表。

因此我为上述要求创建了 Dockerfile,其中有两个阶段。

在第一阶段,它会拉取一个 Maven docker 映像(maven:3.9.6-eclipse-temurin-17-alpine),复制项目源文件后,它会与 .war 文件一起构建项目。

在第二阶段,它会拉取一个tomcat docker镜像(tomcat:10.1.19),并将第一阶段生成的.war文件复制到tomcat的webapps文件夹中,然后启动tomcat服务器。

下面是我用来构建 docker 镜像并运行生成的 docker 容器的两个命令

docker build -t tmr-app

docker run -it --rm -p 8080:8080 tmr-app

当我向 docker 容器中运行的 tomcat 服务器发送有效的 POST 请求时,我希望在 postman 中收到成功响应。但我收到了 404 错误。

我尝试通过将本地生成的 .war 文件复制到 tomcat 容器的 webapps 文件夹来删除在容器本身中构建 .war 文件的第一阶段。令人惊讶的是,当我从更新的 docker 映像启动 docker 容器时,它按预期工作,并且我也在邮递员中得到了成功响应。

我是 docker 的新手,我对 docker 的多阶段构建过程有点困惑。如果有人能帮助我解决这个问题,那就太好了。

下面是我创建的 Dockerfile

# get maven image
FROM maven:3.9.6-eclipse-temurin-17-alpine AS maven

# set working directory
WORKDIR /usr/var/app

# copy project management file (POM.XML)
COPY pom.xml .

# copy source files
COPY src .

# build project
RUN ["mvn", "clean", "install"]

# get tomcat image
FROM tomcat:10.1.19 AS server

# set work directory
WORKDIR /usr/local/tomcat/webapps

# copy war file into the tomcat webapps
COPY --from=maven /usr/var/app/target/*.war .

# expose port
EXPOSE 8080

# run tomcat server
CMD ["catalina.sh", "run"]

下面是有效的 Dockerfile!

# get tomcat image
FROM tomcat:10.1.19

# set work directory
WORKDIR /usr/local/tomcat/webapps

# copy war file into the tomcat webapps
COPY target/*.war .

# expose port
EXPOSE 8080

# run tomcat server
CMD ["catalina.sh", "run"]

java docker rest servlets containers
1个回答
0
投票

我尝试过,但无法重现您的问题。

我不是 Java|Tomcat 开发人员,所以我有一个稍微不同的

Containerfile
,其中
mvn
用于生成基本应用程序。

我想知道您的多阶段构建中的

maven
server
构建步骤之间是否存在未在单阶段构建中复制的工件(解释为什么该步骤有效)!?

Containerfile.1

FROM maven:3.9.6-eclipse-temurin-17-alpine AS maven

# Because mvn generate creates 'app' folder
WORKDIR /usr/var

RUN mvn archetype:generate \
    -DgroupId=com.example \
    -DartifactId=app \
    -DarchetypeArtifactId=maven-archetype-webapp \
    -DinteractiveMode=false

# Need to run mvn from within app folder (and it is not workdir)
RUN cd app && mvn clean install

# Debugging
RUN tree

FROM tomcat:10.1.19 AS server

WORKDIR /usr/local/tomcat/webapps

COPY --from=maven /usr/var/app/target/*.war .

# Debugging
RUN ls -la

# This is documentation only; no effect
EXPOSE 8080

CMD ["catalina.sh", "run"]

我使用

podman
但你可以将
podman
替换为
docker
:

podman build \
--tag=stackoverflow:${Q}-1 \
--file=./Containerfile.1 \
${PWD}

产量:

[1/2] STEP 5/5: RUN tree
.
└── app
    ├── pom.xml
    ├── src
    │   └── main
    │       ├── resources
    │       └── webapp
    │           ├── WEB-INF
    │           │   └── web.xml
    │           └── index.jsp
    └── target
        ├── app
        │   ├── META-INF
        │   ├── WEB-INF
        │   │   ├── classes
        │   │   └── web.xml
        │   └── index.jsp
        ├── app.war
        ├── classes
        └── maven-archiver
            └── pom.properties

[2/2] STEP 4/6: RUN ls -la
total 4
drwxr-xr-x  2 root root   14 Mar  3 19:45 .
drwxr-xr-x 11 root root   14 Mar  3 19:45 ..
-rw-r--r--  1 root root 1617 Mar  3 19:45 app.war

然后:

podman run \
--interactive --tty --rm \
--publish=8080:8080/tcp \
stackoverflow:${Q}-1

还有

curl \
--location \
--silent \
http://localhost:8080/app \
--write-out '%{response_code}' \
--output /dev/null

产量

200
© www.soinside.com 2019 - 2024. All rights reserved.