【问题标题】:Docker Containers for Maven Multi-module Spring Boot project with Angular Frontend module带有 Angular 前端模块的 Maven 多模块 Spring Boot 项目的 Docker 容器
【发布时间】:2019-08-26 04:58:18
【问题描述】:

我有位于同一个父 Maven 项目下的 Maven 多模块项目(Angular 前端模块 + SpringBoot 后端模块)。我想在 Docker 多容器中运行应用程序(前端的 docker 容器 + 后端的 docker 容器 + 数据库的 docker 容器)。如何使用 Docker Compose 运行 docker 多容器?

我在父项目中创建了“docker-compose.yml”,并在每个模块中添加了“Dockerfile”。
这是我的项目结构

docker-compose.yml 文件

version: '3'

services:
  docker-container-application-mariadb:
    image: mariadb:latest
    environment:
      - MYSQL_ROOT_PASSWORD=*****
      - MYSQL_DATABASE=*******
      - MYSQL_USER=*******
      - MYSQL_PASSWORD=*******
    volumes:
      - /data/application-mariadb
  docker-container-application-backend:
    image: docker-image-application-backend
    build:
      context: ./application-backend
      dockerfile: Dockerfile
    depends_on:
      - docker-container-application-mariadb
    ports:
      - 8087:8080
    volumes:
      - /data/application-backend

后端 Dockerfile:

FROM openjdk:8
EXPOSE 8080
ADD target/application_backend.jar application_backend.jar
# Run the jar file
ENTRYPOINT ["java", "-jar", "application_backend.jar"]
ENTRYPOINT ["java", "-jar", "application_backend.jar"]

当我跑步时:

docker-compose up

这是我得到的错误:

Step 4/6 : ADD $PWD/application-backend/target/application_backend.jar application_backend.jar
ERROR: Service 'docker-container-application-backend' failed to build: ADD failed: stat /var/lib/docker/tmp/docker-builder971325573/esysync-backend/target/application_backend.jar: no such file or directory

代码更新后的错误:

@Milah 建议的代码更新后错误:

【问题讨论】:

    标签: maven docker docker-compose multi-module docker-maven-plugin


    【解决方案1】:

    这应该有效。我没有要测试的环境,所以如果您遇到错误,请告诉我,我会修复它们。

    将此 Docker 文件放在项目的根目录下(与 docker-compose 级别相同)。

    Dockerfile:

    FROM maven:3.6.0-jdk-8-alpine as build
    
    WORKDIR /app
    
    COPY . .
    
    WORKDIR /app/application-backend
    
    RUN mvn clean package -DskipTests=true
    
    FROM openjdk:8
    
    WORKDIR /app
    
    COPY --from=build /app/application-backend/target/*.jar ./
    
    EXPOSE 8080
    
    # Run the jar file
    ENTRYPOINT ["java", "-jar", "/app/application_backend.jar"]
    

    在 Dockerfile 旁边应该还有一个忽略文件。

    .dockerignore

    application-frontend/
    

    您应该按如下方式更改 docker-compose 文件:

    ...
      docker-container-application-backend:
        image: docker-image-application-backend
        build:
          context: ./
          dockerfile: Dockerfile
    ...
    

    声明dockerfile: Dockerfile是多余的,可以删除。

    【讨论】:

    • 非常感谢您的快速回答。我测试了您的代码,但出现以下错误,请参阅我的问题的更新。请提醒我有多模块 Maven 项目。所以父项目包含 2 个模块:前端和后端。每个模块中的 Dockerfiles 和父项目中的 docker-compose
    • 我的错,我没有在根文件夹中看到父 pom ......如果不改变项目的结构就很难让它工作。你真的需要父 pom.xml 吗?与此同时,我正在想办法解决它。
    • @TigrisLaesus 我更新了帖子,我认为这应该可以。
    • 向您的努力致以最诚挚的问候。我仍然没有测试您发送给我的内容...但是在执行您的代码之前我有一个问题,事实上,正如我所提到的,我还有另一个问题模块:前端,稍后必须在单独的 docker 容器中运行,所以这个模块也有自己的 Dockerfile,根据你我应该把后端的 Dockerfile 放在根级别(与父级相同),那又如何关于前端模块 Dockerfile
    • 你得到的错误是完全一样的,这真的很奇怪。你确定你正在运行更新的版本吗?在运行 maven 构建之前,您可以添加此“RUN pwd && ls -lart” - 这应该在日志中打印它尝试运行构建的当前位置以及该文件夹的内容。如果你 。可以在 github 或类似的结构上使用它,也许我可以直接在那里修复它......请记住,解决方案还取决于 pom 文件的结构,目前我只是在猜测。无论如何......同样的错误真的很奇怪。
    猜你喜欢
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2015-10-10
    • 2014-06-02
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多