在golang-migrate的文档中,指出您可以运行此命令以在一个文件夹中运行所有迁移。
docker run -v {{ migration dir }}:/migrations --network host migrate/migrate
-path=/migrations/ -database postgres://localhost:5432/database up 2
您将如何做到这一点以适应新的docker-compose的语法,这不鼓励使用--network
?
更重要的是:您将如何连接到另一个容器中的数据库,而不是本地主机中运行的数据库?
添加到您的docker-compose.yml
中将起作用:
db:
image: postgres
networks:
new:
aliases:
- database
environment:
POSTGRES_DB: mydbname
POSTGRES_USER: mydbuser
POSTGRES_PASSWORD: mydbpwd
ports:
- "5432"
migrate:
image: migrate/migrate
networks:
- new
volumes:
- .:/migrations
command: ["-path", "/migrations", "-database", "postgres://mydbuser:mydbpwd@database:5432/mydbname?sslmode=disable", "up", "3"]
links:
- db
networks:
new:
您没有使用docker run
的--network host
选项,而是设置了一个名为 new
的网络。该网络内的所有服务都通过定义的别名相互访问(在上面的示例中,您可以通过 database
别名访问数据库服务(。然后,您可以像使用该别名一样使用该别名 localhost
,即代替 IP 地址。这解释了此连接字符串:
"postgres://mydbuser:mydbpwd@database:5432/mydbname?sslmode=disable"
@Federico提供的答案一开始就为我工作,但是,我意识到我第一次在全新的环境中运行 docker-compose 时得到了connect: connection refused
,但第二次不是。这意味着迁移容器在数据库准备好处理操作之前运行。由于从 docker-hub 迁移/迁移会在运行时运行"迁移"命令,因此无法添加wait_for_it.sh脚本来等待数据库准备就绪。因此,我们必须添加depends_on
和healthcheck
标签来管理订单执行。所以这是我的码头工人文件:
version: '3.3'
services:
db:
image: postgres
networks:
new:
aliases:
- database
environment:
POSTGRES_DB: mydbname
POSTGRES_USER: mydbuser
POSTGRES_PASSWORD: mydbpwd
ports:
- "5432"
healthcheck:
test: pg_isready -U mydbuser -d mydbname
interval: 10s
timeout: 3s
retries: 5
migrate:
image: migrate/migrate
networks:
- new
volumes:
- .:/migrations
command: ["-path", "/migrations", "-database", "postgres://mydbuser:mydbpwd@database:5432/mydbname?sslmode=disable", "up", "3"]
links:
- db
depends_on:
- db
networks:
new:
从撰写文件格式版本 2 开始,您不必设置网络。
如 docker 网络文档中所述 默认情况下,Compose 会为应用设置单个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器可以访问该容器,并且它们可以通过与容器名称相同的主机名发现。
因此,在您的情况下,您可以执行以下操作:
version: '3.8'
services:
#note this databaseservice name is what we will use instead
#of localhost when using migrate as compose assigns
#the service name as host
#for example if we had another container in the same compose
#that wnated to access this service port 2000 we would have written
# databaseservicename:2000
databaseservicename:
image: postgres:13.3-alpine
restart: always
ports:
- "5432"
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: username
POSTGRES_DB: database
volumes:
- pgdata:/var/lib/postgresql/data
#if we had another container that wanted to access migrate container at let say
#port 1000
#and it's in the same compose file we would have written migrate:1000
migrate:
image: migrate/migrate
depends_on:
- databaseservicename
volumes:
- path/to/you/migration/folder/in/local/computer:/database
# here instead of localhost as the host we use databaseservicename as that is the name we gave to the postgres service
command:
[ "-path", "/database", "-database", "postgres://databaseusername:databasepassword@databaseservicename:5432/database?sslmode=disable", "up" ]
volumes:
pgdata: