8
votes

Création d'une table en mode utilisateur unique à Postgres

im essayant de créer un dockerfile à partir de l'image Postgres. Le repo dit que l'initialisation doit être traitée en plaçant un script shell dans /docker-enterrypoint-initdb.d/. Je mets le script suivant en fonction d'un exemple que j'ai trouvé en ligne:

#!/bin/bash
echo "******CREATING DOCKER DATABASE******"
gosu postgres postgres --single <<- EOSQL
   CREATE DATABASE orpheus;
   CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
   GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
   CREATE TABLE profiles ( \
     profile_id    SERIAL UNIQUE PRIMARY KEY, \
     user_id integer NOT NULL UNIQUE, \
     profile_photo_id integer NOT NULL UNIQUE, \
     age integer \
   );
   CREATE TABLE hidden_user ( \
     owner_id    integer NOT NULL PRIMARY KEY, \
     target_id integer NOT NULL \
   );
EOSQL
echo ""
echo "******DOCKER DATABASE CREATED******"


4 commentaires

Le mode utilisateur unique n'est pas destiné à rien d'autre que la récupération après sinistre: postgreSQL.NNBABBe.com/... La question est la suivante: pourquoi démarrez-vous Postgres en mode un seul utilisateur?


Il est recommandé dans le rappant officiel de Docker pour Postgres. "Si vous avez besoin d'exécuter des commandes SQL dans le cadre de votre initialisation, l'utilisation du mode utilisateur unique Postgres est fortement recommandée." - registre.hub.docker.com/_/postgres


C'est clairement un mauvais conseil


@a_horse_with_no_name Je pense qu'ils essaient d'éviter la base de données à venir et à être disponibles pour des connexions générales avant la fin de l'init souhaité. Il serait infiniment saner pour le démarrer avec list_addresses = '' et utiliser une prise UNIX ou listen_addresses = '127.0.0.1, :: 1' (via le - c` argument à postgres ) et utilisez une session Loopback PSQL , faites ce que vous devez faire et redémarrer PG pour un accès général, mais les personnes Docker semblent préférer un rapide pirater une solution robuste la plupart du temps ...


3 Réponses :


10
votes

@a_horse_with_no_name m'a eu sur la bonne voie avec son commentaire. J'ai décidé de fessoire le mode utilisateur unique, même s'il était "recommandé". Au lieu de cela, je démarre Postgres avec pg_ctl, chargez certains fichiers SQL contenant mes créations de table et arrêtez le serveur avec pg_ctl.

Mon script shell ressemble à ceci: xxx


3 commentaires

Cela a bien fonctionné pour moi. Merci pour le conseil; Je commençais à tourner mes roues.


Vous avez sauvé plusieurs heures de ma vie ... merci beaucoup.


Presque parfait - j'ai commuté l'utilisateur sur les "tables d'initialisation" à une création dans le bootstrap cependant :)



5
votes

Si vous souhaitez empêcher PostgreSQL d'être accessible aux utilisateurs avant toute installation que vous devez effectuer est effectué, commencez-le avec une seule accès de bouclage ou une prise UNIX, faites votre initialisation, puis redémarrez-le pour un accès général.

Je ne parle pas de docker, mais si vous le faisiez dans un environnement régulier, vous feriez quelque chose comme: xxx

IE Démarrez PostgreSQL Ne pas écouter sur des sockets TCP / IP et avec un non par défaut> unix_socket_directories . Faites votre configuration. Puis redémarrez-le avec la valeur par défaut (ou configuré) unix_socket_directories et list_addresses une fois qu'il est prêt pour l'accès général.

au lieu de cela, vous pouvez:

  • Modifier pg_hba.conf Pour autoriser uniquement l'accès à partir de votre utilisateur de configuration / uniquement sur l'adresse de bouclage / etc
  • Démarrer PG
  • Votre configuration
  • remplacer pg_hba.conf avec la production une
  • pg_ctl recharge ou Sélectionnez pg_reload_conf () Pour charger les nouveaux paramètres et permettre l'accès général

    ... Cependant, cela permettra aux applications de se connecter puis rejeter leur authentification pendant la phase de configuration; Cela peut ne pas être ce que vous voulez, et toutes les applications ne le font pas correctement.


1 commentaires

J'aime cette réponse. Nos conteneurs d'applications utilisent un petit script pour attendre que le conteneur Postgres accepte des connexions TCP avant de tenter de la connecter. La présentant brièvement pour importer le schéma est un problème, qui est bien résolu en utilisant une prise locale.



0
votes

J'ai testé votre script et cela fonctionne presque bien. Utilisation de PostgreSQL 9.4 J'ai réussi à procéder à ce qui suit pour fonctionner:

gosu postgres postgres --single -jE <<- EOSQL
   CREATE DATABASE orpheus;
EOSQL
echo    
gosu postgres postgres --single -jE orpheus <<- EOSQL
   CREATE USER docker WITH ENCRYPTED PASSWORD 'pwd_docker';
   GRANT ALL PRIVILEGES ON DATABASE orpheus to docker;
   CREATE TABLE profiles (
     profile_id    SERIAL UNIQUE PRIMARY KEY,
     user_id integer NOT NULL UNIQUE,
     profile_photo_id integer NOT NULL UNIQUE,
     age integer
   );
   CREATE TABLE hidden_user (
     owner_id    integer NOT NULL PRIMARY KEY,
     target_id integer NOT NULL
   );
EOSQL
echo


0 commentaires