docker-compose 环境下备份数据库
要求实现在web页面备份数据库,那当然是mysqldump了,一开始以为必须进入mysql容器执行,其实只需要在web容器中 执行mysqldump 就可以了
dockerfile 如下:
# 基础镜像
FROM openjdk:17-slim
#FROM eclipse-temurin:8-jre
# author
MAINTAINER whp404#RUN mkdir -p /opt/app \
# && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
# && echo "Asia/Shanghai" > /etc/timezone RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.listRUN mkdir -p /opt/app \&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone \&& apt-get update && \apt-get install -y \curl \wget \vim \default-mysql-client \iproute2 \iputils-ping \net-tools \&& rm -rf /var/lib/apt/lists/*WORKDIR /opt/app# 复制jar文件到路径
COPY bootstrap-2.0.jar app.jar
# 启动应用
ENTRYPOINT ["java","-jar","/opt/app/app.jar"]
CMD ["--spring.profiles.active=docker"]
java代码如下:
PrintWriter printWriter = null;BufferedReader bufferedReader = null;try {printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(savePath + backup.getBackupName() + ".sql"), StandardCharsets.UTF_8));Process process = Runtime.getRuntime().exec(" mysqldump -h" + ip + " -P" + host + " -u" + userName + " -p" + password + " --default-character-set=utf8 " + databaseName);InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_8);bufferedReader = new BufferedReader(inputStreamReader);String line;while((line = bufferedReader.readLine())!= null){printWriter.println(line);}printWriter.flush();if(process.waitFor() == 0){//0 表示线程正常终止。File file = new File(savePath + backup.getBackupName() + ".sql");backup.setBackUpSize(readableFileSize(file.length()));backup.setId(IdsUtils.createStrId());backup.setCreateTime(new Date());backup.setUpdateTime(new Date());backupMapper.insert(backup);return true;}} catch (InterruptedException e) {e.printStackTrace();} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (printWriter != null) {printWriter.close();}} catch (IOException e) {e.printStackTrace();}}