我有一个春季启动项目,我想使用docker容器化.
我有几个Spring启动应用程序连接到同一个MySql服务器.
我的spring应用程序需要完全设置数据库(即要创建的所有表和一些表中要插入的数据)才能启动.
我使用Docker版本18.09.0和docker-compose版本1.23.1和ubuntu 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启动项目的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 \n MYSQL_USER=root \n MYSQL_ROOT_PASSWORD=root
ADD ./1.0/create.sql /docker-entrypoint-initdb.d
ADD ./1.0/insert.sql /docker-entrypoint-initdb.d
EXPOSE 3306