使用Docker和PostgreSQL以及SchemaSpy来创建数据库文档(适用于Apple M1芯片)

首先

既经准备好Eclipse和ERMaster,但发现根本没有时间准备文件,那就用SchemaSpy自动生成吧!
…所以,虽然晚了一点,但我终于第一次使用Docker搭建了开发环境。

在那个时候,我精彩地接触了Apple M1芯片的神奇之处并深深着迷,所以我将其记下来作为备忘录。

环境

macOS Monterey 12.3
チップ Apple M1
project directory/
 ├ docker-compose.yml
 ├ postgresql/
 │ └ Dockerfile
 └ schemaspy/
   └ Dockerfile
   └ config/
     └ schemaspy.properties
   └ output/

安装Docker Desktop for Mac

选择搭载苹果芯片的Mac,并安装Docker桌面版。

 

Docker version 20.10.12, build e91ed57

准备一个适用于日本语环境的PostgreSQL Docker容器。

我從DockerHub無腦地複製PostgreSQL官方的Docker映像,但卻遇到了無法設置日本語語言(jp_JP.UTF-8)的困擾。

看起来分发的Docker镜像似乎没有启用日语环境。
根据下面的网站参考,我基于官方的Docker镜像创建了一个启用了日语环境的镜像。

 

在项目目录中创建一个名为”postgresql”的目录,并准备以下类似的Docker文件。
指定了最新的PostgreSQL版本。

FROM postgres:latest
RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.utf8

给项目命名,并且打上标签,进行构建。

docker build -t postgres:latest .

创建Postgresql和PgAdmin的Docker容器。

接下来,我们将创建PostgreSQL和PgAdmin的Docker容器。
返回到项目目录,并创建一个名为docker-compose.yml的文件来创建Docker容器。

version: "3"

services:
  postgresql:
    image: postgres:latest
    container_name: "postgresql"
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      PGPASSWORD: password
      POSTGRES_DB: maindb
      DATABASE_HOST: localhost
    ports:
      - "5432:5432"
    volumes:
      - postgres:/var/lib/postgresql/data
  
  pgadmin:
    image: dpage/pgadmin4
    container_name: "pgadmin"
    restart: always
    ports:
      - 81:80
    environment:
      PGADMIN_DEFAULT_EMAIL: sample@example.com
      PGADMIN_DEFAULT_PASSWORD: password
    volumes:
      - pgadmin:/var/lib/pgadmin
    depends_on:
      - postgres

volumes:
  postgres:
  pgadmin:

创建容器。

docker-compose up -d

通过浏览器访问PgAdmin,并开始构建数据库。
顺便提一下,构建的数据库的转储文件可以通过下面的命令输出。(包含INSERT语句的模式)

docker exec [container_name] pg_dump --column-inserts -U [user_name] [db_name] > maindb.dump.sql

由于本次环境,[container_name]为postgresql,[user_name]为postgres,[db_name]为maindb,所以如下所示。

docker exec postgresql pg_dump --column-inserts -U postgres maindb > maindb.dump.sql

创建SchemaSpy的Docker容器

由于数据库准备就绪,现在是引入SchemaSpy的时候了!

docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:6.1.0 -t pgsql \\
-host localhost:5432 -db maindb -u postgres -p password -connprops useSSL\\\\=false -all

我再次毫无考虑地从DockerHub复制了SchemaSpy官方的Docker镜像,但却完全不能运行,让我觉得非常困惑。

看起来,目前配发的Docker镜像似乎不支持M1芯片的Mac机型。
参考下方网站,我基于官方的Docker镜像创建了适用于M1芯片的镜像。

 

在项目目录中创建名为「schemaspy」的文件夹,并准备以下类似的Docker文件。

FROM openjdk:8u212-jdk-alpine

ENV DRIVER_URL https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.22/postgresql-42.2.22.jar
ENV APP_URL https://github.com/schemaspy/schemaspy/releases/download/v6.1.0/schemaspy-6.1.0.jar

WORKDIR /app

RUN apk --update add graphviz ttf-dejavu && \
    apk --update add --virtual .builddep tzdata wget libressl && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    wget -O postgresql-connector-java.jar ${DRIVER_URL} && \
    wget -O schemaspy.jar ${APP_URL} && \
    apk del .builddep && \
    rm -rf /var/cache/apk/*

根据PostgreSQL的设置,整理SchemaSpy的数据库连接信息。在”schemaspy”目录下创建一个”config”目录,并准备一个名为schemaspy.properties的文件,具体内容如下。

# type of database. Run with -dbhelp for details
schemaspy.t=pgsql
# optional path to alternative jdbc drivers.
schemaspy.dp=/app/postgresql-connector-java.jar
# database properties: host, port number, name user, password
schemaspy.host=postgresql
schemaspy.port=5432
schemaspy.db=maindb
schemaspy.u=postgres
schemaspy.p=password
# output dir to save generated files
schemaspy.o=/output
# db scheme for which generate diagrams
schemaspy.schemas=share,public

SchemaSpy的选项请参考下面的内容。
由于本次数据库中有两个模式(share和public),因此使用schemaspy.schemas选项进行了指定。

 

接下来,在`docker-compose.yml`中添加关于Nginx Docker容器的部分,以便能够使用浏览器查看SchemaSpy的输出结果。
SchemaSpy的输出目录被设置为”output”文件夹。

version: "3"

services:
  postgresql:
    image: postgres:latest
    container_name: "postgresql"
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      PGPASSWORD: password
      POSTGRES_DB: maindb
      DATABASE_HOST: localhost
    ports:
      - "5432:5432"
    volumes:
      - postgres:/var/lib/postgresql/data
  
  pgadmin:
    image: dpage/pgadmin4
    container_name: "pgadmin"
    restart: always
    ports:
      - 81:80
    environment:
      PGADMIN_DEFAULT_EMAIL: sample@example.com
      PGADMIN_DEFAULT_PASSWORD: password
    volumes:
      - pgadmin:/var/lib/pgadmin
    depends_on:
      - postgres

  schemaspy:
    build: ./schemaspy
    image: schemaspy/schemaspy:6.1.0
    container_name: "schemaspy"
    volumes:
      - ./schemaspy/output:/output
      - ./schemaspy/config/schemaspy.properties:/app/schemaspy.properties:ro
    command: "java -jar schemaspy.jar"

  nginx_schemaspy:
    image: nginx
    container_name: "nginx_schemaspy"
    depends_on:
      - schemaspy
    ports:
      - "8080:80"
    volumes:
      - ./schemaspy/output:/usr/share/nginx/html:ro

volumes:
  postgres:
  pgadmin:

回到项目目录并创建容器。

docker-compose up -d

现在SchemaSpy终于能够正常运行了。
在Docker Desctop上运行SchemaSpy的Docker镜像,会将文件输出到”output”目录中。

最终

构建在Windows环境下可能更好,我之后觉得,但好在最终成功准备好了环境。

广告
将在 10 秒后关闭
bannerAds