我希望这已经解决了,但如果还没有,问题在于mysql docker容器启动滞后。
另一个问题是您可能需要构建 jar 文件,然后将其复制到容器中。这是一个大问题,因为当您构建 jar 文件时,以 db 作为主机名的数据库不可用。因此,当您构建 jar 文件时,请跳过测试。
这是我创建的 bash 脚本,但您可以一个一个地运行命令:
#!/bin/bash
cd storage-service
rm -rf target/
mvn clean compile package -Dmaven.test.skip=true
cd ..
docker-compose up
如果您想在容器中初始化 db。该文件位于我有一个文件 database.env 的文件夹 env 中
-- create the databases
CREATE DATABASE IF NOT EXISTS model_storage;
-- create the users for each database
CREATE USER 'arsene'@'localhost' IDENTIFIED BY 'arsene';
GRANT CREATE, ALTER, INDEX, LOCK TABLES, REFERENCES, UPDATE, DELETE, DROP, SELECT, INSERT ON `model_storage`.* TO 'arsene'@'localhost';
FLUSH PRIVILEGES;
后端服务 Dockerfile 如下所示:
FROM adoptopenjdk/openjdk11
COPY target/*.jar storage.jar
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /storage.jar" ]
EXPOSE 8089
数据库 env 文件如下所示:
MYSQL_ROOT_PASSWORD=arsene
MYSQL_DATABASE=model_storage
MYSQL_USER=arsene
MYSQL_PASSWORD=arsene
DATABASE_HOST=model_storage
DATABASE_USER=arsene
DATABASE_PASSWORD=arsene
DATABASE_NAME=model_storage
DATABASE_PORT=3306
如果您打算在图像中传递 JAVA_OPTS 环境。这些可以稍后使用,如下面的 docker-compose.yml 所示
您的后端(依赖于 mysql db 的服务)需要重新启动,直到 docker-compose 能够解析 mysql 的容器名称,在我的例子中它的名称是 db。并且不要忘记在 docker-compose 后端服务映像中包含数据源连接属性,如下所示。我不是 spring boot 方面的专家,也不是 docker 方面的专家,但现在它可以工作!
以下是我的结构方式:
我正在使用 docker version: "3.8"
仓储服务
storage-service:
container_name: storage-service
restart: always
build:
context: storage-service
image: "service_storage_image"
depends_on:
- db
ports:
- "8089:8089"
links:
- db
env_file:
- env/database.env
environment:
WAIT_HOSTS: db:3306
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/model_storage?allowPublicKeyRetrieval=true&useSSL=false
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: arsene
healthcheck:
test: "/usr/bin/mysql --user=arsene --password=arsene--execute \"SHOW DATABASES;\""
interval: 2s
timeout: 20s
retries: 10
environment:
- JAVA_OPTS=
-DEUREKA_SERVER=http://eureka-registry-server:7070/eureka
-DZIPKIN_SERVER=http://zipkin:9411/
networks:
- private-network-mms
我在 docker-compose 中的数据库是这样构造的:
mysql数据库
db:
hostname: db
container_name: db
image: "mysql:latest"
env_file:
- env/database.env
volumes:
- type: bind
source: ./env/setup.sql
target: /docker-entrypoint-initdb.d/setup.sql
- db_volume:/var/lib/mysql
ports:
- 3307:3306
networks:
- private-network-mms