Estou usando a imagem oficial do Postgres Docker tentando personalizar sua configuração. Para isso, utilizo o comando sed
para alterar, max_connections
por exemplo:
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
Tentei dois métodos para aplicar esta configuração. A primeira é adicionando os comandos a um script e copiando-o dentro da pasta init "/docker-entrypoint-initdb.d". O segundo método é executá-los diretamente em meu Dockerfile com o comando "RUN" (esse método funcionou bem com uma imagem Postgresql não oficial com um caminho diferente para o arquivo de configuração "/ etc / postgres / ..."). Em ambos os casos as alterações falham porque o arquivo de configuração está faltando (acho que ainda não foi criado).
Como devo alterar a configuração?
Editar 1:
Aqui está o Dockerfile usado para criar a imagem:
# 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"]
Com este Dockerfile, o processo de compilação mostra o erro: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
fonte
docker exec -it container_id bash
seguida, fazer suas modificações e, em seguida,docker commit container_id myuser/myimage_myPostegresql:myversion
consulte o documento docs.docker.com/reference/commandline/cli/#commitpaintedfox/postgresql
é possível alterar a configuração diretamente no Dockerfile. Acho que isso também deveria ser possível com a imagem oficial.Respostas:
A
postgres:9.4
imagem da qual você herdou declara um volume em/var/lib/postgresql/data
. Isso significa essencialmente que você não pode copiar nenhum arquivo para esse caminho na imagem; as alterações serão descartadas.Você tem poucas escolhas:
Você pode simplesmente adicionar seus próprios arquivos de configuração como um volume em tempo de execução com
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. No entanto, não tenho certeza de como isso irá interagir com o volume existente.Você pode copiar o arquivo quando o contêiner for iniciado. Para fazer isso, copie seu arquivo para o build em um local que não esteja abaixo do volume e, em seguida, chame um script do entrypoint ou cmd que copiará o arquivo para corrigir o local e iniciará o postgres.
Clone o projeto por trás da imagem oficial do Postgres e edite o Dockerfile para adicionar seu próprio arquivo de configuração antes que o VOLUME seja declarado (qualquer coisa adicionada antes da instrução VOLUME é automaticamente copiada no tempo de execução).
Passe todas as mudanças de configuração na opção de comando no arquivo docker-compose
gostar:
fonte
Com Docker Compose
Ao trabalhar com o Docker Compose, você pode usar
command: postgres -c option=value
em seudocker-compose.yml
para configurar o Postgres.Por exemplo, isso faz com que o Postgres registre em um arquivo:
Adaptando a resposta da Vojtech Vitek , você pode usar
para alterar o arquivo de configuração que o Postgres usará. Você montaria seu arquivo de configuração personalizado com um volume:
Aqui está o
docker-compose.yml
do meu aplicativo, mostrando como configurar o Postgres:Permissão para escrever no diretório de log
Observe que, no Linux, o diretório de log no host deve ter as permissões corretas. Caso contrário, você obterá o erro um pouco enganador
Digo enganoso, pois a mensagem de erro sugere que o diretório no contêiner tem a permissão errada, quando na realidade o diretório no host não permite a gravação.
Para corrigir isso, defino as permissões corretas no host usando
fonte
docker-compose.yml
.Injetar postgresql.conf personalizado no contêiner Docker do postgres
O
postgresql.conf
arquivo padrão fica dentro dePGDATA
dir (/var/lib/postgresql/data
), o que torna as coisas mais complicadas, especialmente ao executar o contêiner postgres pela primeira vez, já que odocker-entrypoint.sh
wrapper invoca ainitdb
etapa dePGDATA
inicialização do dir.Para personalizar a configuração do PostgreSQL no Docker de forma consistente, sugiro usar a
config_file
opção postgres junto com os volumes do Docker como este:Banco de dados de produção (diretório PGDATA como volume persistente)
Banco de dados de teste (diretório PGDATA será descartado depois
docker rm
)Depurando
-d
(opção de desanexar) dodocker run
comando para ver os logs do servidor diretamente.Conecte-se ao servidor postgres com o cliente psql e consulte a configuração:
fonte
Quando você executar o ponto de entrada oficial (AKA quando você iniciar o container), ele é executado
initdb
em$PGDATA
(/var/lib/postgresql/data
por padrão), e, em seguida, ele armazena no diretório estes 2 arquivos:postgresql.conf
com configurações manuais padrão.postgresql.auto.conf
com as configurações substituídas automaticamente comALTER SYSTEM
comandos.O entrypoint também executa quaisquer
/docker-entrypoint-initdb.d/*.{sh,sql}
arquivos.Tudo isso significa que você pode fornecer um script shell / SQL nessa pasta que configura o servidor para a próxima inicialização (que será imediatamente após a inicialização do banco de dados ou nas próximas vezes que você inicializar o contêiner).
Exemplo:
conf.sql
Arquivo:Dockerfile
Arquivo:E então você terá que executar
conf.sql
manualmente em bancos de dados já existentes. Como a configuração é armazenada no volume, ela sobreviverá às reconstruções.Outra alternativa é passar a
-c
bandeira quantas vezes desejar:Dessa forma, você não precisa construir uma nova imagem e não precisa se preocupar com bancos de dados já existentes ou não; todos serão afetados.
fonte
Você pode colocar seu personalizado
postgresql.conf
em um arquivo temporário dentro do contêiner e sobrescrever a configuração padrão em tempo de execução.Fazer isso :
postgresql.conf
dentro de seu contêinerupdateConfig.sh
arquivo em/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
No tempo de execução, o contêiner executará o script interno
/docker-entrypoint-initdb.d/
e sobrescreverá a configuração padrão com sua configuração personalizada.fonte
/docker-entrypoint-initdb.d/updateConfig.sh
:?Verifiquei todas as respostas e ainda há outra opção. Você pode alterar seu valor CMD no arquivo docker (não é o melhor, mas ainda é a maneira possível de atingir seu objetivo).
Basicamente, precisamos
Exemplo de arquivo Docker:
Embora eu ache que usar
command: postgres -c config_file=/etc/postgresql/postgresql.conf
em seudocker-compose.yml
arquivo proposto por Matthias Braun seja a melhor opção.fonte
Uma solução bastante de baixa tecnologia para este problema parece ser declarar o serviço (estou usando swarm no AWS e um arquivo yaml) com seus arquivos de banco de dados montados em um volume persistente (aqui AWS EFS conforme indicado pelo cloudstor: driver aws especificação).
Um efeito colateral agradável de persistir sua configuração é que também persiste seus bancos de dados (ou era o contrário) ;-)
fonte
Minha solução é para colegas que precisam fazer alterações na configuração antes de iniciar docker-entrypoint-initdb.d
Fui necessário alterar a configuração de 'shared_preload_libraries' para que durante seu trabalho o postgres já tenha uma nova biblioteca pré-carregada e o código em docker-entrypoint-initdb.d possa usá-la.
Então, acabei de corrigir o arquivo postgresql.conf.sample no Dockerfile:
E com este patch tornou-se possível adicionar extensão no arquivo .sql em docker-entrypoint-initdb.d /:
fonte
Isso funciona para mim:
fonte
Usando o docker compose, você pode montar um volume com
postgresql.auto.conf
. Exemplo:fonte
postgresql.auto.conf
como ele é sobrescrito. Usepostgresql.conf
no mesmo local.Eu também estava usando a imagem oficial (
FROM postgres
) e consegui mudar a configuração executando os seguintes comandos.A primeira coisa é localizar o arquivo de configuração do PostgreSQL. Isso pode ser feito executando este comando no banco de dados em execução.
Eu meu caso ele retorna
/data/postgres/postgresql.conf
.A próxima etapa é descobrir qual é o hash do contêiner docker do PostgreSQL em execução.
Isso deve retornar uma lista de todos os contêineres em execução. No meu caso é assim.
Agora você precisa alternar para o bash dentro de seu contêiner executando:
Dentro do contêiner, verifique se a configuração está no caminho correto e exiba-o.
Eu queria alterar as conexões máximas de 100 para 1000 e o buffer compartilhado de 128 MB para 3 GB. Com o comando sed posso fazer uma pesquisa e substituir pelas variáveis correspondentes na configuração.
A última coisa que precisamos fazer é reiniciar o banco de dados dentro do contêiner. Descubra qual versão de PostGres você está usando.
No meu caso, é
12
Portanto, agora você pode reiniciar o banco de dados executando o seguinte comando com a versão correta.fonte