J'utilise l' image officielle de Postgres Docker pour essayer de personnaliser sa configuration. Pour cela, j'utilise la commande sed
pour changer max_connections
par exemple:
sed -i -e"s/^max_connections = 100.*$/max_connections = 1000/" /var/lib/postgresql/data/postgresql.conf
J'ai essayé deux méthodes pour appliquer cette configuration. La première consiste à ajouter les commandes à un script et à le copier dans le dossier init "/docker-entrypoint-initdb.d". La deuxième méthode consiste à les exécuter directement dans mon Dockerfile avec la commande "RUN" (cette méthode a bien fonctionné avec une image Postgresql non officielle avec un chemin différent vers le fichier de configuration "/ etc / postgres / ..."). Dans les deux cas, les modifications échouent car le fichier de configuration est manquant (je pense qu'il n'est pas encore créé).
Comment changer la configuration?
Modifier 1:
Voici le Dockerfile utilisé pour créer l'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"]
Avec ce Dockerfile, le processus de construction affiche l'erreur: sed: can't read /var/lib/postgresql/data/postgresql.conf: No such file or directory
la source
docker exec -it container_id bash
puis à effectuer vos modifications, puis àdocker commit container_id myuser/myimage_myPostegresql:myversion
consulter le document docs.docker.com/reference/commandline/cli/#commitpaintedfox/postgresql
il est possible de modifier la configuration directement dans le Dockerfile. Je pense que cela devrait également être possible avec l'image officielle.Réponses:
L'
postgres:9.4
image dont vous avez hérité déclare un volume à/var/lib/postgresql/data
. Cela signifie essentiellement que vous ne pouvez copier aucun fichier sur ce chemin dans votre image; les modifications seront supprimées.Vous avez quelques choix:
Vous pouvez simplement ajouter vos propres fichiers de configuration en tant que volume au moment de l'exécution avec
docker run -v postgresql.conf:/var/lib/postgresql/data/postgresql.conf ...
. Cependant, je ne sais pas exactement comment cela interagira avec le volume existant.Vous pouvez copier le fichier au démarrage du conteneur. Pour ce faire, copiez votre fichier dans la construction à un emplacement qui n'est pas sous le volume, puis appelez un script depuis le point d'entrée ou cmd qui copiera le fichier à l'emplacement correct et lancera postgres.
Clonez le projet derrière l'image officielle de Postgres et éditez le Dockerfile pour ajouter votre propre fichier de configuration avant que le VOLUME ne soit déclaré (tout ce qui a été ajouté avant que l'instruction VOLUME soit automatiquement copiée au moment de l'exécution).
Passer toutes les modifications de configuration dans l'option de commande dans le fichier docker-compose
comme:
la source
Avec Docker Compose
Lorsque vous travaillez avec Docker Compose, vous pouvez utiliser
command: postgres -c option=value
dans votredocker-compose.yml
pour configurer Postgres.Par exemple, cela crée un journal Postgres dans un fichier:
En adaptant la réponse de Vojtech Vitek , vous pouvez utiliser
pour changer le fichier de configuration que Postgres utilisera. Vous monteriez votre fichier de configuration personnalisé avec un volume:
Voici le
docker-compose.yml
de mon application, montrant comment configurer Postgres:Autorisation d'écrire dans le répertoire du journal
Notez que sous Linux, le répertoire du journal sur l'hôte doit disposer des autorisations appropriées. Sinon, vous obtiendrez l'erreur légèrement trompeuse
Je dis trompeur, car le message d'erreur suggère que le répertoire dans le conteneur a la mauvaise autorisation, alors qu'en réalité le répertoire sur l'hôte ne permet pas d'écrire.
Pour résoudre ce problème, j'ai défini les autorisations correctes sur l'hôte en utilisant
la source
docker-compose.yml
.Injecter postgresql.conf personnalisé dans le conteneur Docker postgres
Le
postgresql.conf
fichier par défaut se trouve dansPGDATA
dir (/var/lib/postgresql/data
), ce qui rend les choses plus compliquées, en particulier lors de l'exécution du conteneur postgres pour la première fois, car ledocker-entrypoint.sh
wrapper appelle l'initdb
étape d'PGDATA
initialisation du répertoire.Pour personnaliser la configuration PostgreSQL dans Docker de manière cohérente, je suggère d'utiliser
config_file
option postgres avec des volumes Docker comme celui-ci:Base de données de production (répertoire PGDATA comme volume persistant)
Base de données de test (le répertoire PGDATA sera supprimé après
docker rm
)Débogage
-d
(detach option) dedocker run
pour afficher directement les journaux du serveur.Connectez-vous au serveur postgres avec le client psql et interrogez la configuration:
la source
Lorsque vous exécutez le point d'entrée officiel (AKA lorsque vous lancez le conteneur), il s'exécute
initdb
dans$PGDATA
(/var/lib/postgresql/data
par défaut), puis il stocke dans ce répertoire ces 2 fichiers:postgresql.conf
avec les paramètres manuels par défaut.postgresql.auto.conf
avec des paramètres remplacés automatiquement avec desALTER SYSTEM
commandes.Le point d'entrée exécute également tous les
/docker-entrypoint-initdb.d/*.{sh,sql}
fichiers.Tout cela signifie que vous pouvez fournir un script shell / SQL dans ce dossier qui configure le serveur pour le prochain démarrage (qui aura lieu immédiatement après l'initialisation de la base de données ou lors du prochain démarrage du conteneur).
Exemple:
conf.sql
fichier:Dockerfile
fichier:Et puis vous devrez exécuter
conf.sql
manuellement dans des bases de données déjà existantes. La configuration étant stockée dans le volume, elle survivra aux reconstructions.Une autre alternative est de passer le
-c
drapeau autant de fois que vous le souhaitez:De cette façon, vous n'avez pas besoin de créer une nouvelle image, et vous n'avez pas besoin de vous soucier des bases de données déjà existantes ou non; tout sera affecté.
la source
Vous pouvez placer votre personnalisation
postgresql.conf
dans un fichier temporaire à l'intérieur du conteneur et remplacer la configuration par défaut lors de l'exécution.Pour faire ça :
postgresql.conf
dans votre conteneurupdateConfig.sh
fichier dans/docker-entrypoint-initdb.d/
Dockerfile
updateConfig.sh
Au moment de l'exécution, le conteneur exécutera le script à l'intérieur
/docker-entrypoint-initdb.d/
et écrasera la configuration par défaut par votre configuration personnalisée.la source
/docker-entrypoint-initdb.d/updateConfig.sh
?J'ai parcouru toutes les réponses et il reste une autre option. Vous pouvez modifier la valeur de votre CMD dans le fichier docker (ce n'est pas le meilleur, mais toujours le moyen possible d'atteindre votre objectif).
Fondamentalement, nous devons
Exemple de fichier Docker:
Bien que je pense que l'utilisation
command: postgres -c config_file=/etc/postgresql/postgresql.conf
dans votredocker-compose.yml
fichier proposé par Matthias Braun est la meilleure option.la source
Une solution assez low-tech à ce problème semble être de déclarer le service (j'utilise swarm sur AWS et un fichier yaml) avec vos fichiers de base de données montés sur un volume persistant (ici AWS EFS comme indiqué par le pilote cloudstor: aws spécification).
Un effet secondaire agréable de la persistance de votre configuration est qu'elle persiste également dans vos bases de données (ou était-ce l'inverse) ;-)
la source
Ma solution s'adresse aux collègues qui doivent apporter des modifications à la configuration avant de lancer docker-entrypoint-initdb.d
J'avais besoin de changer le paramètre 'shared_preload_libraries', donc pendant son travail, postgres a déjà une nouvelle bibliothèque préchargée et le code dans docker-entrypoint-initdb.d peut l'utiliser.
Je viens donc de patcher le fichier postgresql.conf.sample dans Dockerfile:
Et avec ce patch, il devient possible d'ajouter une extension dans le fichier .sql dans docker-entrypoint-initdb.d /:
la source
Cela fonctionne pour moi:
la source
En utilisant docker compose, vous pouvez monter un volume avec
postgresql.auto.conf
. Exemple:la source
postgresql.auto.conf
car il est écrasé. Utilisez lepostgresql.conf
au même endroit.J'utilisais également l'image officielle (
FROM postgres
) et j'ai pu modifier la configuration en exécutant les commandes suivantes.La première chose à faire est de localiser le fichier de configuration PostgreSQL. Cela peut être fait en exécutant cette commande dans votre base de données en cours d'exécution.
Moi mon cas ça revient
/data/postgres/postgresql.conf
.L'étape suivante consiste à déterminer quel est le hachage de votre conteneur Docker PostgreSQL en cours d'exécution.
Cela devrait renvoyer une liste de tous les conteneurs en cours d'exécution. Dans mon cas, ça ressemble à ça.
Vous devez maintenant passer au bash à l'intérieur de votre conteneur en exécutant:
À l'intérieur du conteneur, vérifiez si la configuration est dans le bon chemin et affichez-la.
Je voulais changer le nombre maximum de connexions de 100 à 1000 et le tampon partagé de 128 Mo à 3 Go. Avec la commande sed, je peux faire une recherche et remplacer par les variables correspondantes dans la configuration.
La dernière chose que nous devons faire est de redémarrer la base de données dans le conteneur. Découvrez quelle version de PostGres vous utilisez.
Dans mon cas
12
, vous pouvez maintenant redémarrer la base de données en exécutant la commande suivante avec la version correcte en place.la source