0

我有一个 Dockerfile,它实际上正在构建一个 maven spring boot 项目。我的 docker-compose.yml 如下

version: '3'
services:
  db:
    image: mysql
    restart: always
    environment:
      - MYSQL_DATABASE=calero
      - MYSQL_ROOT_PASSWORD=root
    volumes:
      - ./db:/var/lib/mysql
    ports:
      - "3306:3306"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    restart: always
    environment:
      PMA_ARBITRARY: 1
      MYSQL_ROOT_PASSWORD: root
    ports:
      - "8082:80"
    links:
      - "db:db"
  redsparrow:
    build: .
    restart: always
    ports:
      - "8081:8080"
    links:
      - "db:db"
    depends_on:
      - db
volumes:
  db:
    driver: "local"

Dockerfile 就是这个

FROM maven:3.6.0-jdk-11 as build
WORKDIR /app
COPY . /app 
RUN mvn clean package

FROM tomcat
COPY context.xml /usr/local/tomcat/webapps/manager/META-INF/context.xml
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml
COPY --from=build /app/target/*.war /usr/local/tomcat/webapps

但是我在这里面临的 docker-compose 总是尝试在启动 mySQL 容器和 mvn clean 包之前尝试构建 redsparrow,因为它没有启动,所以构建不会成功。

我想我遗漏了一些东西,以便在数据库容器启动后始终构建 Spring Boot 应用程序(redsparrow)。

请帮忙!

4

1 回答 1

0

据我所知,docker-compose.yml配置不提供您在问题中概述的功能。包含该build: .选项的服务映像将始终独立构建。但是,您可以通过其他方式实现您想要的。

总而言之,有问题的服务是一个 dockerized Java/Maven/Spring-Boot 项目,它依赖于一个 dockerized MySQL 数据库,并且需要访问该数据库来构建您的项目mvn clean package,这可能是由于testMaven中存在集成测试阶段。

为了克服这个问题,我看到了两种可能的方法(第一种方法比第二种方法更不标准,也更不容易实现;所以我将主要详细说明后者):

  1. 您可以依靠docker-maven-plugin直接从 Maven 旋转 MySQL 容器。另请参阅此博客文章。这里的实际问题是,这些docker命令在所考虑的 Docker 容器中不能直接使用,除非您依赖DinD(Docker-in-Docker)。

  2. 一种更简单的方法是调整测试本身,而不是更改 docker 设置:

    • 这更接近标准约定,假设mvn test(由 触发mvn package)针对单元测试,而mvn verify(依赖于故障安全Maven 插件)针对集成测试,涉及外部数据库或服务;
    • 尽管如此,如果您想保持相同数量的涉及数据库操作的单元测试,您可能需要使用内存数据库引擎,例如H2,它通常在 Spring Boot 单元测试的上下文中使用(参见例如教程);
    • 然后,您可以按照本教程那篇文章中的方法大纲将您的集成测试移动到一个额外的 docker-compose 服务中,例如:

      integrationtest:
          build: ./integrationtest
          command: ./wait-for-it.sh -h db -p 3306 -s -t 150 -- mvn verify
          depends_on:
            - db
      

顺便说一句,请注意该links:属性现在已弃用
另请注意,上述.yml摘录依赖于等待它,因为该depends:属性仅等待依赖项的容器启动,而不是完全准备好。

于 2019-01-02T16:28:23.123 回答