Sri*_*mar 6 java tomcat maven docker
我正在尝试使用 Java、Maven 和 Tomcat 创建一个 doket 容器。
到目前为止,我能够使用 Maven 创建一个容器并编译我的 java 代码并创建最终的 WAR 文件。
但我想将此 WAR 文件复制到另一个 Tomcat 容器的特定文件夹(tomcat 的 webapp 文件夹)。
方法一、Dockerfile
FROM maven:3.6.1-jdk-8 as maven_builder
ENV HOME=/app
WORKDIR $HOME
ADD pom.xml $HOME
RUN ["/usr/local/bin/mvn-entrypoint.sh", "mvn", "verify", "clean", "--fail-never"]
ADD . $HOME
RUN ["mvn","clean","install","-T","2C","-DskipTests=true"]
FROM tomcat:8.5.43-jdk8
COPY --from=maven_builder $HOME/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps
Run Code Online (Sandbox Code Playgroud)
我尝试简单地复制它,但中间容器在复制之前被删除。
方法 2,我正在尝试为 docker-compose 编写 YAML 并使用共享卷概念。
version: '3'
services:
maven-build:
build: .
volumes:
- 'myshare:/shared'
tomcat-build:
image: 'tomcat:8.5.43-jdk8'
ports:
- '8080:8080'
volumes:
- 'myshare:/shared'
volumes:
myshare:
driver: local '
Run Code Online (Sandbox Code Playgroud)
我不知道如何将特定文件从一个容器(即 maven_build)复制到另一个容器(即 tomcat 的 webapp 文件夹)。
您的第一个(多阶段构建)方法是更好的实践。
在多阶段构建中,每次有新FROM命令来启动新映像时,执行环境都会重置。特别是,当第一阶段设置HOME环境变量时,该环境变量会在第二阶段重置,因此最终COPY命令是复制出来/wc_admin/...,而不是复制应用程序构建的目录。
通常将 Docker 文件系统布局视为固定的,并且不设置这样的变量,HOME这些变量在其他上下文中有意义,但在 Docker 中却没有意义。我只是在整个过程中进行硬编码/app:
FROM maven:3.6.1-jdk-8 as maven_builder
WORKDIR /app
ADD pom.xml .
...
FROM tomcat:8.5.43-jdk8
COPY --from=maven_builder /app/wc_admin/target/wc-admin.war /usr/local/tomcat/webapps
Run Code Online (Sandbox Code Playgroud)
体积方法有两个大问题。人们尝试利用 Docker 用映像中的内容填充命名卷,但这仅在第一次运行时有效。如果您重建映像,Docker 会拒绝接触该卷(它具有必须保留的重要用户数据,这就是卷的用途),因此您的卷将保留旧文件.war。如果您在 Kubernetes 中运行应用程序,它不会自动从映像填充卷,您需要做更多的工作才能使卷共享设置起作用。
| 归档时间: |
|
| 查看次数: |
8780 次 |
| 最近记录: |