diff --git a/.env.local b/.env.local index 1ffeb93..421c124 100644 --- a/.env.local +++ b/.env.local @@ -1,6 +1,3 @@ -# MySQL Docker 容器名称(根据实际情况修改) -MYSQL_CONTAINER=mysql-server - # 本地数据库连接信息 DB_USER=root DB_PASSWORD=mysql123 diff --git a/Dockerfile b/Dockerfile index 3c278b6..d1a9090 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,10 @@ -FROM arigaio/atlas:latest +FROM arigaio/atlas:latest-alpine +# 设置工作目录,迁移目录通常会挂载到这里 WORKDIR /app COPY atlas.hcl . COPY schema.sql . -COPY migrate.sh . -ENTRYPOINT ["/app/migrate.sh"] +# 设置 ENTRYPOINT,使得容器启动时默认运行 Atlas +ENTRYPOINT ["/atlas"] diff --git a/atlas.hcl b/atlas.hcl index 18e817b..354b73b 100644 --- a/atlas.hcl +++ b/atlas.hcl @@ -7,5 +7,4 @@ env "local" { env "prod" { src = "file://schema.sql" url = getenv("DB_URL") - dev = "mysql://root:mysql123@localhost:3306/atlas_dev" } diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 0000000..fb649cd --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,58 @@ +version: "3.8" + +services: + # 测试数据库 + test-mysql: + image: mysql:8.0 + environment: + MYSQL_ROOT_PASSWORD: testpass + MYSQL_DATABASE: testdb + ports: + - "13306:3306" + healthcheck: + test: + [ + "CMD", + "mysqladmin", + "ping", + "-h", + "localhost", + "-u", + "root", + "-ptestpass", + ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s + + # 创建 testdb_dev 数据库 + create-dev-db: + image: mysql:8.0 + command: + [ + "sh", + "-c", + "sleep 10 && mysql -h test-mysql -u root -ptestpass -e 'CREATE DATABASE IF NOT EXISTS testdb_dev;'", + ] + depends_on: + test-mysql: + condition: service_healthy + + # 数据库迁移服务 + db-migrate: + build: . + command: + - "schema" + - "apply" + - "--url" + - "mysql://root:testpass@test-mysql:3306/testdb" + - "--to" + - "file://schema.sql" + - "--dev-url" + - "mysql://root:testpass@test-mysql:3306/testdb_dev" + - "--auto-approve" + depends_on: + create-dev-db: + condition: service_completed_successfully + restart: "no" diff --git a/docker-compose.yml b/docker-compose.yml index 6a9f6be..9e08741 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,11 @@ version: "3.8" services: - # 数据库迁移服务 db-migrate: build: . - environment: - # 从环境变量读取数据库连接信息 - DB_URL: "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}" restart: "no" + command: > + schema apply + --url "mysql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}" + --to "file://schema.sql" + --auto-approve \ No newline at end of file diff --git a/migrate.sh b/migrate.sh deleted file mode 100755 index d10d98f..0000000 --- a/migrate.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -echo "开始数据库迁移..." - -if [ -z "$DB_URL" ]; then - echo "错误: DB_URL 环境变量未设置" - exit 1 -fi - -atlas schema apply \ - --env prod \ - --auto-approve - -echo "迁移完成!" diff --git a/test-local.sh b/test-local.sh deleted file mode 100755 index c28e80d..0000000 --- a/test-local.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -set -e - -# 加载配置 -if [ -f .env.local ]; then - export $(cat .env.local | grep -v '^#' | xargs) -fi - -echo "=========================================" -echo "本地测试数据库迁移" -echo "使用容器: $MYSQL_CONTAINER" -echo "=========================================" - -# 1. 创建 atlas_dev 数据库 -echo "" -echo "步骤 1: 创建 atlas_dev 数据库" -docker exec $MYSQL_CONTAINER mysql -uroot -pmysql123 -e "CREATE DATABASE IF NOT EXISTS atlas_dev;" - -# 2. 生成 schema.sql -echo "" -echo "步骤 2: 生成 schema.sql" -./generate-migration.sh - -# 3. 创建测试数据库 -echo "" -echo "步骤 3: 创建测试数据库" -docker exec $MYSQL_CONTAINER mysql -uroot -pmysql123 -e "DROP DATABASE IF EXISTS kami_test; CREATE DATABASE kami_test;" - -# 4. 测试迁移 -echo "" -echo "步骤 4: 测试迁移到 kami_test" -export DB_URL="mysql://root:mysql123@localhost:3306/kami_test" -atlas schema apply --env prod --auto-approve - -# 5. 验证结果 -echo "" -echo "步骤 5: 验证迁移结果" -docker exec $MYSQL_CONTAINER mysql -uroot -pmysql123 kami_test -e "SHOW TABLES;" - -echo "" -echo "=========================================" -echo "测试完成!" -echo "========================================="