我有一个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)。
请帮助!
答案 0 :(得分:0)
据我所知,docker-compose.yml
配置未提供您在问题中概述的功能。包含build: .
选项的服务映像将始终独立构建。但是,您可以通过其他方式实现您想要的。
总而言之,所讨论的服务是一个基于dockerized MySQL数据库的dockerized Java / Maven / Spring-Boot项目,使用mvn clean package
构建您的项目需要访问该数据库,可能是由于test
Maven阶段是否存在集成测试。
为克服这一点,我看到了两种可能的方法(第一种方法比第二种方法标准性较低,并且较不易实现;因此,我将主要介绍后者):
您可以依靠docker-maven-plugin直接从Maven旋转MySQL容器。另请参见this blog article。这里的实际问题是,除非您依赖DinD(Docker-in-Docker),否则docker
命令在所考虑的Docker容器中不直接可用。
一种更简单的方法涉及修改测试本身,而不是更改docker设置:
mvn test
(由mvn package
触发)以单元测试为目标,而mvn verify
(基于failsafe Maven插件)以集成测试为目标,则这与标准惯例更为接近。涉及外部数据库或服务; 然后,您可以按照this tutorial和that 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:
属性仅等待依赖项的容器启动,而尚未完全准备就绪。