首页 > 解决方案 > MySql Docker Container 的数据在 docker-compose up 后不持久

问题描述

我正在运行两个 docker 容器:

并且我可以确保数据的持久性,这要归功于数据量。

那是我的 docker-compose.yml

version: '3'
services:

  docker-mysql-activity:
    image: mysql:latest
    container_name: docker-mysql-activity
    volumes:
    - mysql_activity:/var/lib/mysql
    ports:
      - 33061:3306
    environment:
        - MYSQL_ROOT_PASSWORD=admin123
        - MYSQL_DATABASE=SCactivity
        - MYSQL_USER=testuser
        - MYSQL_PASSWORD=testuser@123

  activity-service:
    image: activity-service:latest
    container_name: activity-service
    environment:
      - SPRING_APPLICATION_NAME=activity-service
    hostname: activity-service
    build:
      context: ./activity-service
      dockerfile: Dockerfile
    ports:
      - 9001:9001
    depends_on:
      - service-registry
      - docker-mysql-activity

volumes:
  mysql_activity:

当我执行doke-compose up一切顺利并创建卷时,我已经验证查看 Docker 的卷文件夹并正确保存数据(所有验证都通过邮递员验证 - GET 和 POST 数据正常工作)。

当我尝试docker-compose downdocker-compose stop然后docker-compose up再次出现问题时,数据不再存在。

我确信这个问题与docker-compose down无关,因为卷仍然存在,而是当我执行命令docker-compose up时重置卷内的数据。

标签: mysqldockerdocker-composemicroservicespersistent-volumes

解决方案


编辑

活动服务是一个 Spring Boot 微服务。

它有这个 application.yml:

server:
  port: 9001

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://docker-mysql-activity:3306/SCactivity?createDatabaseIfNotExist=true
    username: testuser
    password: testuser@123
    hikari:
      initialization-fail-timeout: 0
  jpa:
    database-platform: org.hibernate.dialect.MySQL5Dialect
    generate-ddl: true
    show-sql: true
    hibernate:
      ddl-auto: create

表类是Activity.java:

@Entity
@Table(name = "Activity")
@Getter
@Setter
public class Activity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ACT_ID")
    private long id;
    @Column(name = "NAME")
    private final String name;
    @Column(name = "DESCR")
    private final String descr;
    @Column(name = "fitness")
    private Boolean fitness;
    @Column(name = "nuoto")
    private Boolean nuoto;


    public Activity() {
        this.name = "";
        this.descr = "";
    }
}

解决 了问题在这里:

server:
  port: 9001

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://docker-mysql-activity:3306/SCactivity?createDatabaseIfNotExist=true
    username: testuser
    password: testuser@123
    hikari:
      initialization-fail-timeout: 0
  jpa:
    database-platform: org.hibernate.dialect.MySQL5Dialect
    generate-ddl: true
    show-sql: true
    hibernate:
      ddl-auto: create

代替

ddl-auto: create 

ddl-auto:update

推荐阅读