Đầu tiên, những biến môi trường đó trông đáng ngờ. Hãy xem tài liệu về hình ảnh Docker chính thức
và lưu ý rằng bạn cần POSTGRES_DB
, POSTGRES_USER
và POSTGRES_PASSWORD
, thay vì DB_NAME
, DB_USER
và DB_PASS
.
Ngoài ra, bạn dường như hầu hết đang đi đúng hướng. Đây là một ví dụ đầy đủ:
Đầu tiên, tôi bắt đầu một vùng chứa Postgres. Tôi đang định vị bộ nhớ liên tục ở đâu đó bên ngoài thư mục chính của mình, vì như bạn đã lưu ý rằng các tệp sẽ không thuộc quyền sở hữu của bạn, điều này có thể gây nhầm lẫn trong thư mục chính của bạn (mặc dù không nhất thiết có vấn đề):
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
Vì đây là lần đầu tiên tôi bắt đầu postgres trỏ vào thư mục dữ liệu đó, chúng tôi sẽ thấy nó khởi tạo cơ sở dữ liệu:
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:
Bây giờ, từ một cửa sổ khác, tôi có thể kết nối với nó ...
$ 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.
... và tạo một số dữ liệu:
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)
Bây giờ, tôi thoát khỏi vùng chứa:
^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
Chúng tôi có thể xác minh rằng nó không còn chạy nữa:
$ docker ps | grep postgres
Nhưng nếu chúng ta khởi động lại nó với cùng các đối số dòng lệnh;
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
Chúng tôi thấy rằng nó không khởi tạo cơ sở dữ liệu, vì nó đã tồn tại và chuyển thẳng đến:
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
Tại thời điểm này, chúng tôi có thể kết nối lại với cơ sở dữ liệu và thấy rằng dữ liệu của chúng tôi vẫn tồn tại:
$ 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)
Đó là tất cả những gì cần có.