Volume tidak tersedia pada waktu pembuatan. Anda dapat membuat /var/lib/postgresql/data di skrip Anda tetapi akan ditimpa oleh VOLUME /var/lib/postgresql/data dari postgres:9.6 gambar.
Dalam kasus Anda:cukup gunakan file buruh pelabuhan berikut:
FROM postgres:9.6
COPY ./create_fixtures.sql /docker-entrypoint-initdb.d/create_fixtures.sql
Mereka dieksekusi secara otomatis setelah wadah dimulai. Ini contohnya:
$ docker run -d --name mydb -p 33306:3306 yourtag
$ docker exec -ti mydb psql -U postgres
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
------------+----------+----------+------------+------------+-----------------------
mydatabase | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =Tc/postgres +
| | | | | postgres=CTc/postgres+
| | | | | webuser=CTc/postgres
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
Jawaban usang:
Skrip Anda harus berfungsi pada wadah kecuali di fixture Anda harus menjalankan psql seperti ini:
su postgres -c "psql -f create_fixtures.sql"
su --login postgres tidak berfungsi karena postgres tidak dapat membuka bash atau Shell. Anda dapat mencoba dengan docker run --rm -ti postgres:9.6 bash .
Maaf saya harus memberi tahu Anda bahwa ada satu kesalahan lagi dalam skrip sql Anda:GRANT ALL PRIVILEGES ON DATABASE mydatabase TO webuser - kata kunci DATABASE diperlukan di sini.
Berikut adalah log lengkap bagaimana saya menguji dan mengonfirmasi bahwa ini berhasil:
docker run --rm -ti postgres:9.6 bash
example@sqldat.com:/# cat > test.sql <<EOF
> CREATE DATABASE mydatabase WITH ENCODING 'UTF8';
> CREATE USER webuser ENCRYPTED PASSWORD 'asdf123' NOSUPERUSER NOCREATEDB NOCREATEROLE;
> GRANT ALL PRIVILEGES ON DATABASE mydatabase TO webuser;
> EOF
example@sqldat.com:/# pg_createcluster 9.6 main --start
Creating new PostgreSQL cluster 9.6/main ...
/usr/lib/postgresql/9.6/bin/initdb -D /var/lib/postgresql/9.6/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
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/9.6/main ... 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:
/usr/lib/postgresql/9.6/bin/pg_ctl -D /var/lib/postgresql/9.6/main -l logfile start
Ver Cluster Port Status Owner Data directory Log file
9.6 main 5432 online postgres /var/lib/postgresql/9.6/main /var/log/postgresql/postgresql-9.6-main.log
example@sqldat.com:/# /etc/init.d/postgresql start
[ ok ] Starting PostgreSQL 9.6 database server: main.
example@sqldat.com:/# su postgres -c "psql -f test.sql"
CREATE DATABASE
CREATE ROLE
GRANT
example@sqldat.com:/# /etc/init.d/postgresql stop
[ ok ] Stopping PostgreSQL 9.6 database server: main.
example@sqldat.com:/# exit
exit