EDIT - sejak 23 Jul 2015
Gambar poster docker resmi akan menjalankan .sql
skrip yang ditemukan di /docker-entrypoint-initdb.d/
folder.
Jadi yang Anda butuhkan adalah membuat skrip sql berikut:
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
dan tambahkan di Dockerfile Anda:
Dockerfile
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
Tapi sejak 8 Juli 2015, jika semua yang Anda butuhkan adalah untuk membuat user dan database yang , lebih mudah untuk hanya menggunakan make ke POSTGRES_USER
, POSTGRES_PASSWORD
dan POSTGRES_DB
variabel lingkungan:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
atau dengan Dockerfile:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
untuk gambar yang lebih tua dari 23 Jul 2015
Dari dokumentasi gambar postgres Docker , dikatakan demikian
[...] ini akan mencari skrip * .sh yang ditemukan di direktori [ /docker-entrypoint-initdb.d
] untuk melakukan inisialisasi lebih lanjut sebelum memulai layanan
Yang penting di sini adalah "sebelum memulai layanan" . Ini berarti skrip Anda make_db.sh akan dieksekusi sebelum layanan postgres dimulai, oleh karena itu pesan kesalahan "tidak dapat terhubung ke database postgres" .
Setelah itu ada informasi lain yang bermanfaat:
Jika Anda perlu menjalankan perintah SQL sebagai bagian dari inisialisasi Anda, penggunaan mode pengguna tunggal Postgres sangat dianjurkan.
Setuju ini bisa sedikit misterius pada tampilan pertama. Apa yang dikatakannya adalah bahwa skrip inisialisasi Anda harus memulai layanan postgres dalam mode tunggal sebelum melakukan aksinya. Jadi Anda bisa mengubah skrip make_db.ksh Anda sebagai berikut dan itu akan membuat Anda lebih dekat dengan apa yang Anda inginkan:
CATATAN , ini telah berubah baru-baru ini di komit berikut . Ini akan bekerja dengan perubahan terbaru:
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
Sebelumnya, penggunaan --single
mode diperlukan:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
gosu postgres postgres --single < /tmp/somefile.sql
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
saya melihat sayainit.sql
dengan kode sql di dalamnya. TETAPI ketika saya membuka mysql (menggunakan akses root) dan ketik show database saya hanya melihat default didocker-compose.yml
file! Mengapa ini tidak berhasil untuk saya?db.sql
bahkan setelah itu disalin ke `docker-entrypoint-initdb.d`Anda sekarang dapat meletakkan file .sql di dalam direktori init:
Dari dokumen
Jadi, menyalin file .sql Anda akan berfungsi.
sumber
Warning: scripts in /docker-entrypoint-initdb.d are only run if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup. One common problem is that if one of your /docker-entrypoint-initdb.d scripts fails (which will cause the entrypoint script to exit) and your orchestrator restarts the container with the already initialized data directory, it will not continue on with your scripts.
Dengan menggunakan
docker-compose
:Dengan asumsi bahwa Anda memiliki tata letak direktori berikut:
Mengajukan:
docker-compose.yml
Mengajukan:
Docker/init.sql
Mengajukan:
Docker/db.Dockerfile
Menyusun dan memulai layanan:
sumber
Saya menambahkan perintah kustom ke lingkungan yang ditimbulkan dalam CMD setelah memulai layanan ... Saya belum melakukannya dengan postgres, tetapi dengan Oracle:
dan mulai dengan
.
sumber
Anda dapat menggunakan perintah ini:
sumber
ENCODING 'LATIN1'
sangat aneh ... Anda harus memiliki kebutuhan khusus untuk menghindari penggunaan utf8Anda harus menjalankan database sebelum membuat pengguna. Untuk ini, Anda perlu beberapa proses. Anda dapat memulai postgres dalam subshell (&) di skrip shell, atau menggunakan alat seperti supervisord untuk menjalankan postgres dan kemudian menjalankan skrip inisialisasi.
Panduan untuk supervisord dan buruh pelabuhan https://docs.docker.com/articles/using_supervisord/
sumber
Dengan komposisi docker ada alternatif sederhana (tidak perlu membuat Dockerfile). Cukup buat init-database.sh:
Dan rujuk di bagian volume:
sumber