使用Testcontainers运行SchemaSpy容器生成文档遇容器提前停止问题求助
解决SchemaSpy容器启动后立即停止的问题
你的问题核心在于:当将SchemaSpy容器的entrypoint设为/bin/sh时,容器启动后没有持续运行的前台进程,执行完sh命令就会立即退出,导致后续exec和cp操作无法进行。以下是几种可行的解决办法:
办法一:启动容器时保持后台运行
通过让容器执行一个持续运行的命令(比如tail -f /dev/null),让容器保持存活,之后再通过exec进入容器执行操作:
- 启动PostgreSQL容器(示例命令):
docker run -d --name postgres -e POSTGRES_PASSWORD=your_password -e POSTGRES_DB=target_db postgres:latest - 启动SchemaSpy容器并保持后台运行:
docker run -d --name schemaspy --link postgres:db schemaspy/schemaspy --entrypoint /bin/sh -c "tail -f /dev/null" - 执行SchemaSpy生成数据库文档:
docker exec schemaspy schemaspy -t pgsql -host db -u postgres -p your_password -db target_db -o /output - 将生成的文档打包:
docker exec schemaspy tar -czf /output.tar.gz /output - 复制打包文件到本地:
docker cp schemaspy:/output.tar.gz ./ - 完成后清理容器:
docker rm -f schemaspy postgres
办法二:一次性执行完整流程(无需保持容器存活)
直接在容器启动时执行SchemaSpy生成命令+打包命令,容器执行完所有命令后会停止,但此时容器仍存在,可以直接复制文件:
- 启动PostgreSQL容器(同办法一)
- 启动SchemaSpy容器执行完整流程:
docker run --name schemaspy --link postgres:db schemaspy/schemaspy /bin/sh -c "schemaspy -t pgsql -host db -u postgres -p your_password -db target_db -o /output && tar -czf /output.tar.gz /output" - 复制打包文件到本地:
docker cp schemaspy:/output.tar.gz ./ - 清理容器:
docker rm schemaspy postgres
办法三:使用Docker Compose编排(适合重复执行场景)
如果需要多次执行,可以用docker-compose.yml定义服务,让SchemaSpy容器依赖PostgreSQL,并执行完整流程:
创建docker-compose.yml:
version: '3' services: postgres: image: postgres:latest environment: POSTGRES_PASSWORD: your_password POSTGRES_DB: target_db volumes: - ./postgres_data:/var/lib/postgresql/data schemaspy: image: schemaspy/schemaspy depends_on: - postgres entrypoint: /bin/sh command: > -c "schemaspy -t pgsql -host postgres -u postgres -p your_password -db target_db -o /output && tar -czf /output.tar.gz /output" volumes: - ./output:/output # 直接挂载本地目录,无需复制文件
执行命令:
docker-compose up
执行完成后,生成的文档和tar包会直接出现在本地的./output目录下。
内容的提问来源于stack exchange,提问作者Semyon Kirekov
相关产品推荐
相关产品推荐

