1

我有位于同一个父 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 建议的代码更新后出错: 在此处输入图像描述

4

1 回答 1

2

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

将此 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是多余的,可以删除。

于 2019-04-04T12:29:20.373 回答