首先,这些环境变量看起来很可疑。看看官方 Docker 镜像的文档 https://hub.docker.com/_/postgres/,并注意你需要POSTGRES_DB
, POSTGRES_USER
, and POSTGRES_PASSWORD
, 而不是DB_NAME
, DB_USER
, and DB_PASS
.
除此之外,你似乎大部分都走在正确的轨道上。这是一个完整的示例:
首先,我启动一个 Postgres 容器。我将持久存储定位在我的主目录之外的某个位置,因为正如您已经注意到的那样,文件不会归您所有,这可能会在您的主目录中造成混乱(尽管不一定有问题):
docker run --rm --name postgres \
-v /tmp/postgres:/var/lib/postgresql/data \
-e POSTGRES_DB=larstest \
-e POSTGRES_USER=lars \
-e POSTGRES_PASSWORD=secret postgres
由于这是我第一次启动 postgres 指向该数据目录,我们将看到它初始化数据库:
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
Success. You can now start the database server using:
现在,从另一个窗口,我可以连接到它......
$ psql -h 172.17.0.4 -U lars larstest
Password for user lars:
psql (9.5.4, server 9.6.0)
WARNING: psql major version 9.5, server major version 9.6.
Some psql features might not work.
Type "help" for help.
...并创建一些数据:
larstest=# create table testtable (id integer);
CREATE TABLE
larstest=# insert into testtable values (1);
INSERT 0 1
larstest=# select * from testtable;
id
----
1
(1 row)
现在,我退出容器:
^CLOG: received fast shutdown request
LOG: aborting any active transactions
FATAL: terminating connection due to administrator command
LOG: autovacuum launcher shutting down
LOG: shutting down
LOG: database system is shut down
我们可以验证它是否不再运行:
$ docker ps | grep postgres
但是如果我们使用相同的命令行参数再次启动它;
docker run --rm --name postgres \
-v /tmp/postgres:/var/lib/postgresql/data \
-e POSTGRES_DB=larstest \
-e POSTGRES_USER=lars \
-e POSTGRES_PASSWORD=secret postgres
我们看到它没有初始化数据库,因为它已经存在,并直接跳到:
LOG: database system was shut down at 2016-10-21 03:13:50 UTC
LOG: MultiXact member wraparound protections are now enabled
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
此时,我们可以重新连接数据库,发现我们的数据仍然存在:
$ psql -h 172.17.0.2 -U lars larstest
Password for user lars:
psql (9.5.4, server 9.6.0)
WARNING: psql major version 9.5, server major version 9.6.
Some psql features might not work.
Type "help" for help.
larstest=# select * from testtable;
id
----
1
(1 row)
这几乎就是全部内容了。