Soru Resmi PostgreSQL Docker görüntüsünün yapılandırma dosyası nasıl özelleştirilir?


Kullanıyorum resmi Postgres Docker resmi yapılandırmasını özelleştirmeye çalışıyor. Bu amaçla ben komuta kullanıyorum sed değişmek max_connections Örneğin:

sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf

Bu yapılandırmayı uygulamak için iki yöntem denedim. Birincisi, komutları bir komut dosyasına ekleyerek ve "/docker-entrypoint-initdb.d" init klasörüne kopyalamaktır. Ikinci yöntem onları doğrudan "RUN" komutu ile Dockerfile içinde çalıştırarak (bu yöntem, yapılandırma dosyası "/ etc / postgres / ...") farklı bir yol ile resmi olmayan bir Postgresql görüntü ile iyi çalıştı. Her iki durumda da yapılandırma dosyası eksik olduğu için değişiklikler başarısız olur (bunun henüz oluşturulmadığını düşünüyorum).

Yapılandırmayı nasıl değiştirmeliyim?

1'i düzenle:

Görüntüyü oluşturmak için kullanılan Dockerfile işte burada:

# 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"]

Bu Dockerfile ile derleme işlemi hatayı gösterir: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory


44
2018-06-15 15:08


Menşei


bir yöntem resmi resmi kullanmak, başlatmak, içeri docker exec -it container_id bash sonra değişikliklerinizi yapın, sonra docker commit container_id myuser/myimage_myPostegresql:myversiondoktora bak docs.docker.com/reference/commandline/cli/#commit - user2915097
Docker paradigmasının avantajlarından birinin, tüm yapım sürecini otomatikleştirmek olduğunu düşünüyorum. Başka bir görüntü ile belirtildiği gibi, paintedfox/postgresqlYapılandırmayı doğrudan Docker dosyasında değiştirmek mümkündür. Bunun resmi imajla da mümkün olduğunu düşünüyorum. - Sakr
sed yöntemi çalışmalı, Dcokerfile ya da tam bir reproducer gönderebilir miyim? - user2915097
Resmi oluşturmak için kullanılan docker dosyasını ekledim - Sakr


Cevaplar:


postgres:9.4 miras aldığınız resim /var/lib/postgresql/data. Bu aslında, görüntüdeki herhangi bir dosyayı bu yolla kopyalayamayacağınız anlamına gelir; değişiklikler atılacaktır.

Birkaç seçeneğin var:

  • Kendi yapılandırma dosyalarınızı çalışma zamanında bir birim olarak ekleyebilirsiniz. docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf .... Ancak, bunun mevcut birim ile nasıl etkileşime gireceğinden tam olarak emin değilim.

  • Kap başlatıldığında dosyayı kopyalayabilirsiniz. Bunu yapmak için, dosyanızı birimin altında olmayan bir yere kopyalayın ve sonra giriş noktasını veya cmd dosyasını kopyalayıp konumu düzeltecek ve postgres başlatacak bir betik çağırın.

  • Postgres resmi görüntüsünün arkasındaki projeyi kopyalayın ve VOLUME bildirilmeden önce kendi yapılandırma dosyanızı eklemek için Dockerfile dosyasını düzenleyin (VOLUME yönergesi otomatik olarak çalışma zamanında kopyalanmadan önce eklenen herhangi bir şey).


25
2018-06-15 16:18



Öyleydi, değişiklikler Dockerfile içerisinde olmamalı. Onları bir senaryoya taşıdım ve onu giriş noktasından aradım ve şimdi iyi çalıştı. Cevap için teşekkür ederim. - Sakr
Komut dosyasını "/docker-entrypoint-initdb.d/" init klasöründe kopyaladım ve bu sefer de iyi çalıştı. Bu çok garip ama çoğu görüntü ile yaptığım gibi, Dockerfile ile görüntüyü ayarlama üzerine odaklanmış gibi görünüyor, init komut dosyasını kullanarak ilk denemelerde bir şey özledim. - Sakr


Docker Compose ile

Docker Compose ile çalışırken, kullanabilirsiniz command: postgres -c option=value senin içinde docker-compose.yml Postgres'i yapılandırmak için

Örneğin, bu Postgres günlüğünü bir dosyaya yapar:

command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs

uyarlanması Vojtech Vitek'in cevabı, kullanabilirsiniz

command: postgres -c config_file=/etc/postgresql.conf

Postgres yapılandırma dosyasını değiştirmek için kullanacaktır. Özel yapılandırma dosyanızı birimle birleştirdiniz:

volumes:
   - ./customPostgresql.conf:/etc/postgresql.conf

Burada docker-compose.yml Postgres'i nasıl yapılandıracağımı gösteren uygulamamın:

# Start the app using docker-compose pull && docker-compose up to make sure you have the latest image
version: '2.1'    
services:
  myApp:
    image: registry.gitlab.com/bullbytes/myApp:latest
    networks:
      - myApp-network
  db:
     image: postgres:9.6.1
     # Make Postgres log to a file.
     # More on logging with Postgres: https://www.postgresql.org/docs/current/static/runtime-config-logging.html
     command: postgres -c logging_collector=on -c log_destination=stderr -c log_directory=/logs
     environment:
       # Provide the password via an environment variable. If the variable is unset or empty, use a default password
       - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-4WXUms893U6j4GE&Hvk3S*hqcqebFgo!vZi}
     # If on a non-Linux OS, make sure you share the drive used here. Go to Docker's settings -> Shared Drives
     volumes:
       # Persist the data between container invocations
       - postgresVolume:/var/lib/postgresql/data
       - ./logs:/logs
     networks:
       myApp-network:
         # Our application can communicate with the database using this hostname
         aliases:
           - postgresForMyApp
networks:
  myApp-network:
    driver: bridge    
# Creates a named volume to persist our data. When on a non-Linux OS, the volume's data will be in the Docker VM
# (e.g., MobyLinuxVM) in /var/lib/docker/volumes/
volumes:
  postgresVolume:

Günlük dizinine yazma izni

Linux'ta, ana bilgisayardaki günlük dizininin doğru izinlere sahip olması gerektiğine dikkat edin. Aksi halde biraz yanıltıcı hata alırsınız

FATAL: günlük dosyası açılamadı   "/logs/postgresql-2017-02-04_115222.log": İzin reddedildi

Yanıltıcı diyorum, çünkü hata mesajı dizinin varlığını gösteriyor kapsayıcıda gerçekte dizinde yanlış izin var ev sahibinde yazıya izin vermiyor.

Ana bilgisayarda doğru izinleri kullanarak

chgroup ./logs docker && chmod 770 ./logs

41
2018-01-28 16:50



Postgre günlüğünü stdout yerine bir dosyaya kaydetmeyi ve bununla başa çıkmak için docker günlükleri komutlarını kullanmayı mı tavsiye edersiniz? çapraz bağlama için kudos github sorunu ! - jpic
Dosyaya giriş yapmanın veya Docker günlüklerinin tercih edilip edilmeyeceğine karar vermem, jpic. - Matthias Braun
Büyük olasılıkla burada maskelemek isteyeceğiniz şifreyi eklediniz - vidstige
@vidstige: Bu rastgele dizeyi parola olarak kullanmıyorum, yalnızca gösterim içindir. - Matthias Braun


Özel postgresql.conf postgres Docker kabına enjekte

Varsayılan postgresql.conf dosya içinde yaşıyor PGDATAdir (/var/lib/postgresql/dataÖzellikle, ilk kez postgres konteyner çalıştırırken işleri daha da karmaşık hale getiren docker-entrypoint.sh sarıcı çağırır initdb için adım PGDATA dir başlatma.

Docker'daki PostgreSQL konfigürasyonunu sürekli olarak özelleştirmek için config_file Docker birimleriyle birlikte postgres seçeneği:

Üretim veritabanı (Kalıcı Hacim olarak PGDATA dir)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-v $CUSTOM_DATADIR:/var/lib/postgresql/data \
-e POSTGRES_USER=postgres \
-p 5432:5432 \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

Test veritabanı (PGDATA dir sonra atılacak docker rm)

docker run -d \
-v $CUSTOM_CONFIG:/etc/postgresql.conf \
-e POSTGRES_USER=postgres \
--name postgres \
postgres:9.6 postgres -c config_file=/etc/postgresql.conf

Hata ayıklama

  1. Kaldır -d (çıkartma seçeneği) docker run sunucu günlüklerini doğrudan görmek için komut.
  2. Postgre sunucusuna psql client ile bağlanın ve yapılandırmayı sorgulayın:

    docker run -it --rm --link postgres:postgres postgres:9.6 sh -c 'exec psql -h $POSTGRES_PORT_5432_TCP_ADDR -p $POSTGRES_PORT_5432_TCP_PORT -U postgres'
    
    psql (9.6.0)
    Type "help" for help.
    
    postgres=# SHOW all;
    

30
2017-11-14 21:29





Resmi giriş noktasını çalıştırdığınızda (kapsayıcıyı başlattığınızda A.K.A.), çalışır initdb içinde $PGDATA (/var/lib/postgresql/data varsayılan olarak) ve daha sonra bu 2 dosyada bu dizinde saklanır:

  • postgresql.conf varsayılan manuel ayarlarla.
  • postgresql.auto.conf ayarlarla otomatik olarak geçersiz kılınır ALTER SYSTEM emreder.

Giriş noktası aynı zamanda herhangi bir /docker-entrypoint-initdb.d/*.{sh,sql} Dosyalar.

Tüm bunlar, bir sonraki önyükleme için sunucuyu yapılandıran bir klasör / SQL komut dosyası sağlayabileceğiniz anlamına gelir (DB başlatma işleminden hemen sonra veya kapsayıcıyı önyüklemenizden hemen sonra).

Örnek:

conf.sql dosya:

ALTER SYSTEM SET max_connections = 6;
ALTER SYSTEM RESET shared_buffers;

Dockerfile dosya:

FROM posgres:9.6-alpine
COPY *.sql /docker-entrypoint-initdb.d/
RUN chmod a+r /docker-entrypoint-initdb.d/*

Ve sonra yürütmek zorunda kalacaksın. conf.sql zaten var olan veritabanlarında manuel olarak. Yapılandırma birimde depolandığından, yeniden oluşturulacak.


Başka bir alternatif geçmek -c İstediğiniz kadar bayrak

docker container run -d postgres -c max_connections=6 -c log_lock_waits=on

Bu sayede yeni bir imaj oluşturmanıza gerek yoktur ve zaten var olan veya olmayan veritabanlarına dikkat etmeniz gerekmez; hepsi etkilenecek.


20
2018-02-28 12:35



Beni kurtardı kardeşim. Teşekkürler ! - You knows who
Sonuncusu, -c'yi geçmek benim favorim. Bu, farklı ortamlar için çok temiz ve basit bir üründür. - epic_fil


Özel koyabilirsiniz postgresql.conf kapsayıcının içindeki geçici bir dosyada ve çalışma zamanında varsayılan yapılandırmanın üzerine yaz.

Bunu yapmak için :

  • Özel kopyalayın postgresql.conf kapınızın içinde
  • Kopyala updateConfig.sh dosyasında /docker-entrypoint-initdb.d/

Dockerfile

FROM postgres:9.6

COPY postgresql.conf      /tmp/postgresql.conf
COPY updateConfig.sh      /docker-entrypoint-initdb.d/_updateConfig.sh

updateConfig.sh

#!/usr/bin/env bash

cat /tmp/postgresql.conf > /var/lib/postgresql/data/postgresql.conf

Çalışma zamanında, kapsayıcı içindeki komut dosyasını yürütür /docker-entrypoint-initdb.d/ ve özel yapılandırmayla varsayılan yapılandırmanın üzerine yaz.


5
2017-09-05 10:09



ikinci kopya komutunda neden "_"? olmamalı: /docker-entrypoint-initdb.d/updateConfig.sh ? - Fernando Castilla Ospina
Çünkü docker-entrypoint-initdb.d / folder komut dosyalarını alfabetik sırayla yürütür. Ve bu betiği diğerlerinden önce uygulamak istiyorum. - alphayax
tnx, altyazıyı kullanmak için kopyanın dosyayı yeniden adlandırdığını unuttum - Fernando Castilla Ospina


Oldukça düşük maliyetli bir çözüm bu soruna hizmetin (AWS ve bir yaml dosyası üzerinde swarm kullanıyorum) kalıcı bir cihaza monte edilmiş veritabanı dosyalarınızla bildirilmesi gibi görünüyor (burada AWS EFS, bulutlaştırıcının gösterdiği gibi: aws sürücüsü Şartname).

  version: '3.3'
  services:
    database:
      image: postgres:latest
      volumes:
        - postgresql:/var/lib/postgresql
        - postgresql_data:/var/lib/postgresql/data
    volumes:
       postgresql:
         driver: "cloudstor:aws" 
       postgresql_data:
         driver: "cloudstor:aws"
  1. Db, görüntü varsayılan ayarlarıyla başlatılmış olarak gelir.
  2. Yeniden ayarları gerektiren eşzamanlı bağlantı sayısını artırmak istiyorsanız, ör.
  3. çalışan konteyneri durdurun (veya hizmeti sıfıra indirip ardından bire geri ölçekleyin)
  4. sürgün yeni bir konteynır doğurur, bu kez bu süre zarfında kalıcı konfigürasyon ayarlarınızı alır ve onları nazikçe uygular.

Konfigürasyonunuzu devam ettirmenin hoş bir yan etkisi de veritabanlarınızı da devam ettirmesidir (ya da başka bir şekilde olduğu gibi) ;-)


2
2017-10-27 12:50





Bütün cevaplara baktım ve başka bir seçenek kaldı. CMD değerinizi docker dosyasında değiştirebilirsiniz (hedefinize ulaşmak için en iyisi değil, yine de olası bir yol).

Temel olarak

  • Config dosyası docker konteynırında kopyala
  • Postgres başlangıç ​​seçeneklerini geçersiz kıl

Docker dosya örneği:

FROM postgres:9.6
USER postgres

# Copy postgres config file into container
COPY postgresql.conf /etc/postgresql

# Override default postgres config file
CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

Her ne kadar düşünürsem de command: postgres -c config_file=/etc/postgresql/postgresql.confsenin içinde docker-compose.yml tarafından önerilen dosya Matthias Braun en iyi seçenek.


1
2018-03-12 05:50