如何使用 docker-compose 运行 golang-migrate



在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_onhealthcheck标签来管理订单执行。所以这是我的码头工人文件:

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:

最新更新