Saya menggunakan image Postgres Docker resmi mencoba menyesuaikan konfigurasinya. Untuk tujuan ini, saya menggunakan perintah sed
untuk mengubah max_connections
misalnya:
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
Saya mencoba dua metode untuk menerapkan konfigurasi ini. Yang pertama adalah dengan menambahkan perintah ke skrip dan menyalinnya di dalam folder init "/docker-entrypoint-initdb.d". Metode kedua adalah dengan menjalankannya langsung di dalam Dockerfile saya dengan perintah "RUN" (metode ini bekerja dengan baik dengan gambar Postgresql tidak resmi dengan jalur berbeda ke file konfigurasi "/ etc / postgres / ..."). Dalam kedua kasus, perubahan gagal karena file konfigurasi hilang (saya pikir itu belum dibuat).
Bagaimana cara mengubah konfigurasi?
Edit 1:
Berikut adalah Dockerfile yang digunakan untuk membuat image:
# Database (http://www.cs3c.ma/)
FROM postgres:9.4
MAINTAINER Sabbane <contact@cs3c.ma>
ENV TERM=xterm
RUN apt-get update
RUN apt-get install -y nano
ADD scripts /scripts
# ADD scripts/setup-my-schema.sh /docker-entrypoint-initdb.d/
# Allow connections from anywhere.
RUN sed -i -e"s/^#listen_addresses =.*$/listen_addresses = '*'/" /var/lib/postgresql/data/postgresql.conf
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/postgresql/data/pg_hba.conf
# Configure logs
RUN sed -i -e"s/^#logging_collector = off.*$/logging_collector = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_directory = 'pg_log'.*$/log_directory = '\/var\/log\/postgresql'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_filename = 'postgresql-\%Y-\%m-\%d_\%H\%M\%S.log'.*$/log_filename = 'postgresql_\%a.log'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_file_mode = 0600.*$/log_file_mode = 0644/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_truncate_on_rotation = off.*$/log_truncate_on_rotation = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_rotation_age = 1d.*$/log_rotation_age = 1d/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_min_duration_statement = -1.*$/log_min_duration_statement = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_checkpoints = off.*$/log_checkpoints = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_connections = off.*$/log_connections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_disconnections = off.*$/log_disconnections = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^log_line_prefix = '\%t \[\%p-\%l\] \%q\%u@\%d '.*$/log_line_prefix = '\%t \[\%p\]: \[\%l-1\] user=\%u,db=\%d'/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_lock_waits = off.*$/log_lock_waits = on/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#log_temp_files = -1.*$/log_temp_files = 0/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#statement_timeout = 0.*$/statement_timeout = 1800000 # in milliseconds, 0 is disabled (current 30min)/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^lc_messages = 'en_US.UTF-8'.*$/lc_messages = 'C'/" /var/lib/postgresql/data/postgresql.conf
# Performance Tuning
RUN sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^shared_buffers =.*$/shared_buffers = 16GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#effective_cache_size = 128MB.*$/effective_cache_size = 48GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#work_mem = 1MB.*$/work_mem = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#maintenance_work_mem = 16MB.*$/maintenance_work_mem = 2GB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_segments = .*$/checkpoint_segments = 32/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#checkpoint_completion_target = 0.5.*$/checkpoint_completion_target = 0.7/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#wal_buffers =.*$/wal_buffers = 16MB/" /var/lib/postgresql/data/postgresql.conf
RUN sed -i -e"s/^#default_statistics_target = 100.*$/default_statistics_target = 100/" /var/lib/postgresql/data/postgresql.conf
VOLUME ["/var/lib/postgresql/data", "/var/log/postgresql"]
CMD ["postgres"]
Dengan Dockerfile ini, proses build menunjukkan kesalahan: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
sumber
docker exec -it container_id bash
kemudian lakukan modifikasi Anda, laludocker commit container_id myuser/myimage_myPostegresql:myversion
lihat dokumen docs.docker.com/reference/commandline/cli/#commitpaintedfox/postgresql
dimungkinkan untuk mengubah konfigurasi secara langsung di dalam Dockerfile. Saya pikir itu juga bisa dilakukan dengan gambar resmi.Jawaban:
Itu
postgres:9.4
gambar yang telah mewarisi dari menyatakan volume di/var/lib/postgresql/data
. Ini pada dasarnya berarti Anda tidak dapat menyalin file apa pun ke jalur itu di gambar Anda; perubahan akan dibuang.Anda punya beberapa pilihan:
Anda bisa menambahkan file konfigurasi Anda sendiri sebagai volume pada saat run-time dengan
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. Namun, saya tidak yakin persis bagaimana itu akan berinteraksi dengan volume yang ada.Anda dapat menyalin file saat penampung dimulai. Untuk melakukan itu, salin file Anda ke dalam build di lokasi yang tidak di bawah volume lalu panggil skrip dari entrypoint atau cmd yang akan menyalin file ke lokasi yang benar dan memulai postgres.
Kloning proyek di belakang gambar resmi Postgres dan edit Dockerfile untuk menambahkan file konfigurasi Anda sendiri sebelum VOLUME dideklarasikan (apa pun yang ditambahkan sebelum instruksi VOLUME secara otomatis disalin pada saat run-time).
Lewati semua perubahan konfigurasi dalam opsi perintah di file tulis-galangan
Suka:
sumber
Dengan Docker Compose
Ketika bekerja dengan Docker Compose, Anda dapat menggunakan
command: postgres -c option=value
di Andadocker-compose.yml
untuk mengkonfigurasi Postgres.Misalnya, ini membuat Postgres masuk ke file:
Mengadaptasi jawaban Vojtech Vitek , Anda dapat menggunakan
untuk mengubah file konfigurasi yang akan digunakan Postgres. Anda akan memasang file konfigurasi khusus Anda dengan volume:
Inilah
docker-compose.yml
aplikasi saya, menunjukkan cara mengkonfigurasi Postgres:Izin untuk menulis ke direktori log
Perhatikan bahwa saat di Linux, direktori log di host harus memiliki izin yang tepat. Jika tidak, Anda akan mendapatkan kesalahan yang sedikit menyesatkan
Saya katakan menyesatkan, karena pesan kesalahan menunjukkan bahwa direktori dalam wadah memiliki izin yang salah, padahal pada kenyataannya direktori pada host tidak mengizinkan penulisan.
Untuk memperbaikinya, saya menetapkan izin yang benar pada host menggunakan
sumber
docker-compose.yml
.Masukkan postgresql.conf kustom ke dalam container Docker postgres
File default
postgresql.conf
berada di dalamPGDATA
dir (/var/lib/postgresql/data
), yang membuat segalanya menjadi lebih rumit terutama saat menjalankan container postgres untuk pertama kalinya, karenadocker-entrypoint.sh
pembungkus memanggilinitdb
langkah untukPGDATA
inisialisasi dir.Untuk menyesuaikan konfigurasi PostgreSQL di Docker secara konsisten, saya sarankan untuk menggunakan
config_file
opsi postgres bersama dengan volume Docker seperti ini:Basis data produksi (dir PGDATA sebagai Volume Persisten)
Database pengujian (dir PGDATA akan dibuang setelah
docker rm
)Debugging
-d
(opsi lepas) daridocker run
perintah untuk melihat log server secara langsung.Hubungkan ke server postgres dengan klien psql dan buat kueri konfigurasi:
sumber
Saat Anda menjalankan entrypoint resmi (AKA saat Anda meluncurkan penampung), itu berjalan
initdb
di$PGDATA
(/var/lib/postgresql/data
secara default), dan kemudian menyimpan di direktori itu 2 file ini:postgresql.conf
dengan pengaturan manual default.postgresql.auto.conf
dengan pengaturan diganti secara otomatis denganALTER SYSTEM
perintah.Titik masuk juga menjalankan
/docker-entrypoint-initdb.d/*.{sh,sql}
file apa pun .Semua ini berarti Anda dapat menyediakan skrip shell / SQL di folder itu yang mengkonfigurasi server untuk boot berikutnya (yang akan segera setelah inisialisasi DB, atau saat berikutnya Anda mem-boot container).
Contoh:
conf.sql
mengajukan:Dockerfile
mengajukan:Dan kemudian Anda harus mengeksekusi
conf.sql
secara manual di database yang sudah ada. Karena konfigurasi disimpan dalam volume, itu akan bertahan dari pembangunan kembali.Alternatif lain adalah mengoper
-c
bendera sebanyak yang Anda inginkan:Dengan cara ini Anda tidak perlu membangun image baru, dan Anda tidak perlu peduli dengan database yang sudah ada atau tidak; semua akan terpengaruh.
sumber
Anda dapat menempatkan kustom Anda
postgresql.conf
di file sementara di dalam penampung, dan menimpa konfigurasi default saat runtime.Untuk melakukannya :
postgresql.conf
Anda di dalam penampung AndaupdateConfig.sh
file tersebut/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
Saat runtime, penampung akan mengeksekusi skrip di dalamnya
/docker-entrypoint-initdb.d/
dan menimpa konfigurasi default dengan konfigurasi kustom Anda.sumber
/docker-entrypoint-initdb.d/updateConfig.sh
?Saya melihat semua jawaban dan ada pilihan lain yang tersisa. Anda dapat mengubah nilai CMD Anda dalam file buruh pelabuhan (ini bukan yang terbaik, tapi masih mungkin cara untuk mencapai tujuan Anda).
Pada dasarnya kita perlu
Contoh file Docker:
Meskipun saya pikir menggunakan file
command: postgres -c config_file=/etc/postgresql/postgresql.conf
Anda yangdocker-compose.yml
diusulkan oleh Matthias Braun adalah pilihan terbaik.sumber
Solusi berteknologi rendah untuk masalah ini tampaknya menyatakan layanan (saya menggunakan swarm di AWS dan file yaml) dengan file database Anda dipasang ke volume yang tetap (di sini AWS EFS sebagaimana dilambangkan oleh cloudstor: aws driver spesifikasi).
Efek samping yang menyenangkan dari mempertahankan konfigurasi Anda adalah bahwa itu juga mempertahankan database Anda (atau sebaliknya) ;-)
sumber
Solusi saya adalah untuk kolega yang perlu membuat perubahan dalam konfigurasi sebelum meluncurkan docker-entrypoint-initdb.d
Saya perlu mengubah pengaturan 'shared_preload_libraries' sehingga selama bekerja, postgres sudah memiliki perpustakaan baru yang dimuat sebelumnya dan kode di docker-entrypoint-initdb.d dapat menggunakannya.
Jadi saya baru saja menambal file postgresql.conf.sample di Dockerfile:
Dan dengan tambalan ini memungkinkan untuk menambahkan ekstensi dalam file .sql di docker-entrypoint-initdb.d /:
sumber
Ini bekerja untuk saya:
sumber
Menggunakan buruh pelabuhan menulis Anda dapat memasang volume dengan
postgresql.auto.conf
. Contoh:sumber
postgresql.auto.conf
karena sudah ditimpa. Gunakanpostgresql.conf
di lokasi yang sama.Saya juga menggunakan gambar resmi (
FROM postgres
) dan saya dapat mengubah konfigurasi dengan menjalankan perintah berikut.Hal pertama adalah mencari file konfigurasi PostgreSQL. Ini dapat dilakukan dengan menjalankan perintah ini di database Anda yang sedang berjalan.
Saya kasus saya itu kembali
/data/postgres/postgresql.conf
.Langkah selanjutnya adalah mencari tahu apa hash dari container docker PostgreSQL Anda yang sedang berjalan.
Ini harus mengembalikan daftar semua kontainer yang berjalan. Dalam kasus saya, tampilannya seperti ini.
Sekarang Anda harus beralih ke bash di dalam penampung Anda dengan menjalankan:
Di dalam wadah, periksa apakah konfigurasi berada di jalur yang benar dan tampilkan.
Saya ingin mengubah koneksi maks dari 100 menjadi 1000 dan buffer bersama dari 128MB menjadi 3GB. Dengan perintah sed saya dapat melakukan pencarian dan mengganti dengan variabel yang sesuai di konfigurasi.
Hal terakhir yang harus kita lakukan adalah memulai ulang database di dalam container. Cari tahu versi PostGres mana yang Anda gunakan.
Dalam kasus saya ini
12
Jadi Anda sekarang dapat memulai ulang database dengan menjalankan perintah berikut dengan versi yang benar di tempat.sumber