如何让 postgres 监听容器的新暴露端口(不是 5432)?

我尝试用 Go 初始化一个数据库。

我在 postgres:alpine 使用端口 5433,因为 5432 已被另一个微服务应用程序占用。


func Init() {

    DB, err = gorm.Open(postgres.New(postgres.Config{

        DSN: "host=url_db user=gorm password=gorm dbname=gorm port=5433 sslmode=disable TimeZone=Asia/Tokyo",

    }), &gorm.Config{})

    if err != nil {

        panic(err)

    }

    autoMigration()

}

  url_db:

    build: 

      context: ./api/services/url/db

      dockerfile: Dockerfile

    container_name: "url_db"

    environment: 

      POSTGRES_USER: gorm

      POSTGRES_PASSWORD: gorm

      POSTGRES_DB: gorm

      POSTGRES_HOST: url_db

    ports:

      - 5433:5433

您可以确认这里只暴露了 5432 。


我试图通过像这样创建一个新的 Dockerfile 来公开 5433。


FROM postgres:alpine

EXPOSE 5433

但我得到了这个错误。


failed to initialize database, got error failed to connect to `host=url_db user=gorm database=gorm`: dial error (dial tcp 172.19.0.3:5433: connect: connection refused)

这条评论:


除非 postgres 实际配置为侦听该端口,否则仅在 docker 映像上公开端口不会做任何事情。– 超级 5 分钟前


这教我标题(如何在 postgres:alpine 图像上公开一个新端口(不是 5432)?)不是重点,所以我更新了标题。


如何让 postgres 监听容器的新暴露端口(不是 5432)?


斯蒂芬大帝
浏览 95回答 3
3回答

偶然的你

您有多种选择:选项 1:定义自己的 postgresql.conf  url_db:    build:       context: ./api/services/url/db      dockerfile: Dockerfile    container_name: "url_db"    command: postgres -c "config_file=/etc/postgresql/postgresql.conf"    environment:       POSTGRES_USER: gorm      POSTGRES_PASSWORD: gorm      POSTGRES_DB: gorm      POSTGRES_HOST: url_db    ports:      - 5433:5433    volumes:      - /path/to/config:/etc/postgresql/postgresql.conf/usr/share/postgresql/postgresql.conf.samplePostgres在容器中有一个示例配置。要运行配置:docker run -i --rm postgres cat /usr/share/postgresql/postgresql.conf.sample > my-postgres.conf选项 1:覆盖 RUN 命令  url_db:    build:       context: ./api/services/url/db      dockerfile: Dockerfile    container_name: "url_db"    command: postgres -c port=5433    environment:       POSTGRES_USER: gorm      POSTGRES_PASSWORD: gorm      POSTGRES_DB: gorm      POSTGRES_HOST: url_db    ports:      - 5433:5433

回首忆惘然

您可以拥有多个在内部侦听同一端口的容器,只要它们映射到主机上的不同端口(如果它们已发布)。在您的示例中,您可以设置url_db:&nbsp; image: postgres:latest&nbsp; environment:&nbsp; &nbsp; POSTGRES_USER: gorm&nbsp; &nbsp; et: cetera&nbsp; ports:&nbsp; &nbsp; - 5433:5432来自 Docker 外部的连接到达重新映射的端口,位于<host ip>:5433. Docker 容器之间的连接使用标准服务端口,在url_db:5432. 这些连接忽略(并且不需要)ports:。现代 Docker 中的“暴露”几乎没有任何意义。它作为图像中的文档最有价值,该图像显示了服务通常使用的端口。理论上,您可以在expose:不修改映像的情况下向 Compose 请求其他端口,但这样做并没有实际效果。

潇潇雨雨

对于 Docker Compose,假设我们要将端口更改为 5433这样做的另一种方法是在 docker-compose.yml 文件中执行以下操作在这种情况下,您可以将 postgres 数据挂载到目录中的卷中 ./db&nbsp; postgres:&nbsp; &nbsp; image: postgres:10.14-alpine&nbsp; &nbsp; environment:&nbsp; &nbsp; &nbsp; POSTGRES_DB: iam&nbsp; &nbsp; ports:&nbsp; &nbsp; &nbsp; - 5433:5433&nbsp; &nbsp; volumes:&nbsp; &nbsp; &nbsp; - ./db:/var/lib/postgresql/data找到 postgresql.conf 文件,然后搜索port将端口更改为port = 5433&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# (change requires restart)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go