docker compose始终构建Dockerfile,因此它不依赖于db

时间:2019-01-01 20:59:41

标签: docker docker-compose

我有一个Dockerfile,它实际上正在构建一个Maven Spring Boot项目。我的docker-compose.yml在下面

    $_SESSION['loggedin'] = true;
    $_SESSION['name'] = $row['Name'];
    $_SESSION['start'] = time();
    $_SESSION['expire'] = $_SESSION['start'] + (1 * 60) ;

Dockerfile是这个

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"

但是我在这里面对的docker-compose总是尝试在旋转mySQL容器和mvn clean软件包之前尝试构建redsparrow,因为它没有启动,然后尝试访问数据库,因此构建无法成功。

我认为我缺少了一些东西,因此应该在数据库容器启动后始终构建spring boot应用程序(redsparrow)。

请帮助!

1 个答案:

答案 0 :(得分:0)

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

总而言之,所讨论的服务是一个基于dockerized MySQL数据库的dockerized Java / Maven / Spring-Boot项目,使用mvn clean package构建您的项目需要访问该数据库,可能是由于test Maven阶段是否存在集成测试。

为克服这一点,我看到了两种可能的方法(第一种方法比第二种方法标准性较低,并且较不易实现;因此,我将主要介绍后者):

  1. 您可以依靠docker-maven-plugin直接从Maven旋转MySQL容器。另请参见this blog article。这里的实际问题是,除非您依赖DinD(Docker-in-Docker),否则docker命令在所考虑的Docker容器中不直接可用。

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

    • 假设mvn test(由mvn package触发)以单元测试为目标,而mvn verify(基于failsafe Maven插件)以集成测试为目标,则这与标准惯例更为接近。涉及外部数据库或服务;
    • 此外,如果要使所有涉及数据库操作的单元测试保持相同,则可能要使用内存数据库引擎,例如H2,该引擎通常在Spring上下文中使用。引导单元测试(例如,参见that tutorial);
    • 然后,您可以按照this tutorialthat article中的方法概述,在一个额外的docker-compose服务中移动集成测试,例如:

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

请注意,links:属性现在为deprecated
还请注意,上面的.yml摘录依赖于wait-for-it,因为depends:属性仅等待依赖项的容器启动,而尚未完全准备就绪。