Volumes sind zur Build-Zeit nicht verfügbar. Sie können /var/lib/postgresql/data
erstellen in Ihrem Skript, aber es wird durch VOLUME /var/lib/postgresql/data
überschrieben von postgres:9.6
Bild.
In Ihrem Fall:Verwenden Sie einfach die folgende Docker-Datei:
FROM postgres:9.6
COPY ./create_fixtures.sql /docker-entrypoint-initdb.d/create_fixtures.sql
Sie werden automatisch ausgeführt, sobald der Container gestartet wird. Hier ist ein Beispiel:
$ 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)
Veraltete Antwort:
Ihr Skript sollte auf einem Container funktionieren außer im Fixture müssen Sie psql so ausführen:
su postgres -c "psql -f create_fixtures.sql"
su --login postgres
funktioniert nicht, weil Postgres keine Bash oder Shell öffnen kann. Sie können es mit docker run --rm -ti postgres:9.6 bash
versuchen .
Entschuldigung, ich muss Ihnen mitteilen, dass Ihr SQL-Skript einen weiteren Fehler enthält:GRANT ALL PRIVILEGES ON DATABASE mydatabase TO webuser
- das Schlüsselwort DATABASE
ist hier notwendig.
Hier ist ein vollständiges Protokoll, wie ich es getestet habe und bestätigen kann, dass es funktioniert:
docker run --rm -ti postgres:9.6 bash
[email protected]:/# 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
[email protected]:/# 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
[email protected]:/# /etc/init.d/postgresql start
[ ok ] Starting PostgreSQL 9.6 database server: main.
[email protected]:/# su postgres -c "psql -f test.sql"
CREATE DATABASE
CREATE ROLE
GRANT
[email protected]:/# /etc/init.d/postgresql stop
[ ok ] Stopping PostgreSQL 9.6 database server: main.
[email protected]:/# exit
exit