Postgresql 扩展docker postgres图像以创建额外的数据库

Postgresql 扩展docker postgres图像以创建额外的数据库,postgresql,go,docker,docker-compose,dockerfile,Postgresql,Go,Docker,Docker Compose,Dockerfile,我已经看过这个话题了: 但我有以下问题: postgres_1 | FATAL: role "docker" does not exist app_1 | Error: Could not establish a connection with the database 这是我的docker-compose.yml文件 version: "2" services: app: build: context: . dockerfile: Doc

我已经看过这个话题了:

但我有以下问题:

postgres_1  | FATAL:  role "docker" does not exist
app_1       | Error: Could not establish a connection with the database
这是我的docker-compose.yml文件

version: "2"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfiles/app.dockerfile
    links:
      - postgres
    depends_on:
      - postgres
    ports:
      - "8080:8080"
    environment:
      PORT: 8080
    networks:
      - neo_dev
    restart: always

  postgres:
    build:
          context: .
          dockerfile: Dockerfiles/postgres.dockerfile
    networks:
      - neo_dev
    volumes:
      - postgresql:/var/lib/postgresql
      # This needs explicit mapping due to https://github.com/docker-library/postgres/blob/4e48e3228a30763913ece952c611e5e9b95c8759/Dockerfile.template#L52
      - postgresql_data:/var/lib/postgresql/data
    ports:
      - "5430:5432"  #in case you already have postgres running in your host machine

networks:
    neo_dev:
      driver: bridge

volumes:
  postgresql:
  postgresql_data:
我的postgres.dockerfile是

FROM library/postgres

MAINTAINER Samir Bouaked "sbouaked@neocasesoftware.com"

ADD Dockerfiles/init.sql /docker-entrypoint-initdb.d/
这是我的init.sql文件

CREATE USER docker with password 'docker';
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
在我的golang应用程序中,我尝试使用

router.GET("/db", func(c *gin.Context) {
        db, err := sql.Open("postgres", "host=postgres port=5432 user=docker dbname=docker password=docker sslmode=disable")
        if err != nil {
            log.Fatal("Error: The data source arguments are not valid - " + err.Error())
        }
        err = db.Ping()

        if err != nil {
            log.Println("Error: Could not establish a connection with the database")
            c.String(http.StatusOK, "hotstName : %s\nDbStatus : %s", os.Getenv("HOSTNAME"), err)
        } else {
            c.String(http.StatusOK, "\nhotstName : %s\nDbStatus : connection ok !\n", os.Getenv("HOSTNAME"))
        }
        defer db.Close()
    })
我尝试了不同的解决方案,比如直接传入dockerfile环境变量

ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
但结果总是一样的。。。 有关更多信息,请查看此回购协议


我不理解这个问题

如果您想通过使用docker compose传递ENV变量来创建DB,您可以指定如下内容

  postgres:
    container_name: postgres
    image: library/postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DATABASE=docker
      - POSTGRES_USER=docker
      - POSTGRES_PASSWORD=docker
      - POSTGRES_ADMIN_PASSWORD=docker
在你的YML文件中。 这将为您创建一个带有DB docker和user/pwd docker的postgres容器,不再需要您自己的dockerfile(因此您可以使用任何支持此行为的postgres映像)


运行compose后(如果它没有按照您的预期工作),如果您的postgres容器工作正常,或者您的应用程序出现问题,您应该查看日志。

这是docker卷的问题

我必须
docker卷rm postgresvolume
,然后再做一次
docker组合--build


这不是环境变量的问题,只是init.sql是现金的,一开始就没有运行。这是因为我在项目开始时做了一些测试

你能使用psql连接到postgres并验证数据库是否存在吗?我也尝试过(我将保留此语法thx),但事实上这不是环境问题!