我有一个spring boot项目,我想使用docker进行容器化。 我有几个Spring Boot应用程序,它们连接到同一台MySql服务器。
我的spring应用程序要求完全建立数据库(即,要创建所有表,并在某些表中插入一些数据)才能启动。
我正在使用 Docker 版本 18.09.0 和 docker-compose 版本 1.23.1 和ubuntu < strong> 16.04 LTS
我有两个文件 create.sql
和 insert.sql
,这些文件用于初始化应用程序要使用的数据库。
我使用命令 docker-compose.yml
创建图像,该命令成功运行并创建图像。
我有以下问题。
我假定在使用docker-compose时,所有依赖容器启动后,容器就会启动。在我的API容器启动之前,有没有办法等待mysql服务器启动并准备接受连接?
如果我选择为应用程序和mysql分别创建容器,而不使用docker-compose,如何确保我的应用程序连接到mysql容器?
是否有其他工具可以帮助我实现这一目标?
注意:
我尝试使用 docker inspect <container_id>
查找mysql容器的IpAddress并使用它进行连接,但它也不起作用。
以下是我用来创建图像的文件。
docker-compose.yml
文件。
version: '3'
services:
demo-mysql:
image: demo-mysql
build: ./demo-mysql
volumes:
- /mnt/data/mysql-data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=demo
- MYSQL_PASSWORD=root
demo-api:
image: demo-api-1.0
build: ./api
depends_on:
- demo-mysql
ports:
- 8080:8080
environment:
- DATABASE_HOST=demo-mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=demo
- DATABASE_PORT=3306
demo1-app:
image: demo1-app-1.0
build: ./demo1
depends_on:
- demo-mysql
ports:
- 8090:8090
environment:
- DATABASE_HOST=demo-mysql
- DATABASE_USER=root
- DATABASE_PASSWORD=root
- DATABASE_NAME=demo
- DATABASE_PORT=3306
以下是spring boot项目的 Dockerfile
FROM java:8
VOLUME /tmp
ARG DATA_PATH=/src/main/resources
ARG APP_PORT=8080
EXPOSE ${APP_PORT}
ADD /build/libs/demo-api.jar demo-api.jar
ENTRYPOINT ["java","-jar","demo-api.jar"]
以下是我用来创建mysql映像的 Dockerfile
FROM mysql:5.7
ENV MYSQL_DATABASE=demo \
MYSQL_USER=root \
MYSQL_ROOT_PASSWORD=root
ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d
EXPOSE 3306
答案 0 :(得分:0)
使用docker-compose(https://docs.docker.com/compose/compose-file/#healthcheck)的healthcheck
功能。
像这样:
services:
demo-mysql:
image: demo-mysql
build: ./demo-mysql
volumes:
- /mnt/data/mysql-data:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=demo
- MYSQL_PASSWORD=root
healthcheck:
test: ["CMD-SHELL", 'mysqladmin ping']
interval: 10s
timeout: 2s
retries: 10
在demo-mysql容器运行良好之前,依赖容器将不会启动