使用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环境下可能更好,我之后觉得,但好在最终成功准备好了环境。