Docker撰写和postgres官方图像环境变量

时间:2017-10-15 08:51:48

标签: postgresql docker docker-compose psql

其实我使用以下docker-compose.yml文件

version: '3.3'

  services:
    postgres:
      container_name: postgres
      image: postgres:latest
      restart: always
      environment:
        POSTGRES_USER: ${POSTGRES_USER}
        POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
        POSTGRES_DB: ${POSTGRES_DB}
        PGDATA: /var/lib/postgresql/data/pgdata
      ports:
        - "5432:5432"
      volumes:
        - ./data/postgres/pgdata:/var/lib/postgresql/data/pgdata

我在docker-compose.yml文件的同一目录中也使用了这个.env文件:

POSTGRES_USER=dbadm
POSTGRES_PASSWORD=dbpwd
POSTGRES_DB=db

然后我以这种方式将bash shell运行到容器中:

docker exec -ti postgres bash

然后调用命令:

psql -h postgres -U dbadm db

我收到错误:

psql: FATAL:  password authentication failed for user "dbadm"

奇怪的是,如果使用默认的图像参数:

psql -h postgres -U admin database

并输入默认密码"密码",它会让我登录,并且似乎忽略了环境变量。

我错过了什么?

来自docker的其他日志 - 撰写日志:

postgres    | 2017-10-15 09:19:15.502 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres    | 2017-10-15 09:19:15.502 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres    | 2017-10-15 09:19:15.505 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres    | 2017-10-15 09:19:15.524 UTC [22] LOG:  database system was shut down at 2017-10-15 09:02:21 UTC
postgres    | 2017-10-15 09:19:15.530 UTC [1] LOG:  database system is ready to accept connections

看不到任何" RUN"关于用户,数据库和密码设置的一行。

2 个答案:

答案 0 :(得分:1)

我创建了一个docker-compose yml和.env文件,其中包含您提供的详细信息,一切正常,如下图所示:

enter image description here enter image description here

我认为您的问题在于传递 -h 参数。

容器内部始终是 localhost 但是,在外面你必须通过:

public ArrayList<ModelTura_spieler> getAllTura_spieler() {
    SQLiteDatabase db = this.getReadableDatabase();
    final ArrayList<ModelTura_spieler> tura_spielerList = new ArrayList<ModelTura_spieler>();
    String selectQuery = "SELECT * FROM tura_spieler";
    final Cursor c = db.rawQuery(selectQuery, null);

        for(c.moveToFirst(); c.getPosition()!=getTura_spielerCount()-1  ; c.moveToNext()){
                    ModelTura_spieler tura_spieler = getModelTura_spielerFromCursor(c);
                    tura_spielerList.add(tura_spieler);
                }
    return tura_spielerList;
}

在docker-compose文件中,因此它将具有posrtgres主机名

答案 1 :(得分:0)

根据https://hub.docker.com/_/postgres文档。

警告:仅当您使用空的数据目录启动容器时,特定于Docker的变量才有效。容器启动时,所有现有数据库都将保持不变。