TypeORM CLI无法通过Docker Compose识别PostgreSQL主机的解决方法咨询
解决TypeORM CLI无法通过Docker网络主机名执行迁移的问题
这个问题的核心是环境网络隔离导致的:
- 你的应用容器运行在Docker的
connection_cadunicobridge网络里,Docker会自动为这个网络提供内部DNS服务,所以容器能识别postgres这个服务名并正确连接数据库。 - 但你在宿主机直接运行TypeORM CLI时,CLI处于宿主机的网络环境,宿主机的DNS系统根本不知道
postgres这个主机名,自然会抛出getaddrinfo ENOTFOUND postgres的错误。
下面给你几个实用的解决方案,按推荐程度排序:
方案一:用Docker Compose运行CLI命令(最推荐)
让TypeORM CLI也进入Docker网络环境,和应用容器共享同一个网络上下文,这样就能直接解析postgres主机名。执行以下命令即可:
docker-compose run --rm api_cadunico yarn typeorm migration:run
--rm参数会在命令执行完成后自动删除临时容器,避免留下无用的容器实例。- 这个方法完全复用你现有的
api_cadunico容器配置,不需要修改任何配置文件,完美适配Docker网络环境。
方案二:修改宿主机hosts文件(适合本地开发快速调试)
如果你习惯在宿主机直接运行CLI命令,可以通过修改宿主机的hosts文件,把postgres主机名映射到本地回环地址:
- Linux/macOS:编辑
/etc/hosts,添加一行:127.0.0.1 postgres - Windows:以管理员身份编辑
C:\Windows\System32\drivers\etc\hosts,添加同样的内容。
这样宿主机就能把postgres解析到localhost(对应Docker映射的5432端口),而应用容器在Docker网络内依然用内部DNS解析postgres服务,两边都能正常工作。不过这个方法需要手动配置,换开发环境时要重新设置,通用性不如方案一。
方案三:创建专门的迁移服务(适合CI/CD场景)
如果是在持续集成或自动化部署场景中,可以在docker-compose.yml里新增一个专门用于执行迁移的服务:
version: '3.7' services: # 保留你原有的api_cadunico和postgres服务... migration: container_name: migration build: context: . target: development command: yarn typeorm migration:run env_file: - .env networks: - connection_cadunico depends_on: - postgres
然后运行以下命令执行迁移:
docker-compose run --rm migration
这个方案让迁移操作完全在Docker环境内完成,不依赖宿主机的任何配置,非常适合自动化流程。
验证效果
无论用哪种方案,执行迁移后都可以检查:
- TypeORM CLI能正常连接数据库并完成迁移
- 应用容器依然能通过
postgres主机名连接数据库,无需修改配置
内容的提问来源于stack exchange,提问作者Wesley Feitosa
相关产品推荐
相关产品推荐

