sql >> Databasteknik >  >> RDS >> PostgreSQL

docker compose:postgresql skapa db, användarpass och ge tillstånd

Utifrån kommentarerna ska jag försöka svara här.

Jag tycker att du ska gå med postgres 11-alpina bild. Och jag ska försöka förklara varför här.

Officiella docker-bilder kommer med ett antal fördelar som du alltid bör tänka på innan du startar din egen.

  1. Uppgraderingsvägen är enkel - när en ny version av programmet som är insvept i bilden släpps kommer den officiella docker-bilden i de flesta fall att uppdateras tillsammans med den. Och vanligtvis respekterar ändringarna de konfigurationskonventioner som bilden har etablerat. Såsom miljövariabler, startspecifikationer. Så att användare enkelt kan ändra taggen i sina stackar och uppgradera. Det kan givetvis förekomma brytande förändringar - kontrollera alltid detta.
  2. Stor användarbas – när bilder som postgres har laddats ner mer än 10 miljoner gånger (2019) betyder det inte bara att det är populärt, utan fungerar i sig som en garanti för att bilden har testats grundligt. Alla elementära buggar har redan rensats bort, och du kommer att ha en lätt tid med bilden.
  3. Optimerad för storlek och prestanda - du kan vara säker på att uppmärksamhet har ägnats åt många detaljer, vilket minimerar storleken på bilden och maximerar prestanda. Många projekt publicerar sina applikationer på några olika Linux-distros. Som postgres - de publicerar debian och en alpine baserade bilder. alpine image är den mindre, medan debian är något större, men ger dig tillgång till de stora debianpaketförråden om du behöver installera extra paket.
  4. Enkel konfiguration - underhållare av de officiella bilderna förstår vanligtvis användningsfallen för deras användarbas mycket väl. Och de försöker göra våra liv som utvecklare och administratörer enklare (gud välsigne dem). Officiella bilder har vanligtvis ganska bra dokumentation direkt på deras landningssida för dockerhubben, eller en länk till en github-repo där README.md kommer att täcka vanliga användningsområden. Jag tycker att dessa instruktioner är värda att läsa uppifrån och ner.

Jag förstår att du vill hålla bilden liten, men vad vet du - postgres-projektet har täckt ditt användningsområde.

Den senaste alpina postgres-bilden taggad 11-alpine har ett komprimerat fotavtryck på 28 MB och dekomprimerad på 70 MB . Medan archlinux/base bild som du vill börja med har ett komprimerat basfotavtryck på 153 MB och en dekomprimerad storlek på 445 MB . Och det är innan du introducerar postgres själv.

Lägg till det, att databasen och användaren som du vill skapa vid uppstart - kan hanteras enbart i miljövariablerna för den officiella postgres-bilden. Så här:

docker run -d --name some-postgres \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -e POSTGRES_USER=simha \
  -e POSTGRES_DB=btgapp \
postgres:11-alpine

Om det inte täcker initieringen som du behöver för din databas, kan du kopiera .sql skript (och .sh skript) till en speciell plats i bilden - och de kommer att köras vid uppstart. För detta kan du utöka deras bild så här:

init-user-db.sh

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE USER simha;
    CREATE DATABASE btgapp;
    GRANT ALL PRIVILEGES ON DATABASE btgapp TO simha;
EOSQL

Och sedan med en Dockerfile så här:

Dockerfile

FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh

(Detta är hämtat från postgres-beskrivningen på docker hub )

Avslutningsvis – jag skulle rekommendera att du inte prioriterar den distro som en bild bygger på framför användbarheten och underhållbarheten. Docker gör det möjligt för oss att köra applikationer i containrar utan att bry oss för mycket om vilken distro som finns inuti containern. Allt är linux i alla fall. I slutet av dagen förväntar jag mig att du vill ha en stabil postgres-databasbehållare som jag. Detta är vad jag får med den officiella postgres-bilden.

Jag hoppas att jag hjälpte dig att utvärdera dina alternativ i detta.




  1. Hur man lägger till MySQL-tabellkolumn med ett standardvärde för en annan kolumn i den befintliga raden

  2. Kan inte VÄLJA från UPDATE RETURNING-satsen i postgres

  3. Sublime Text MySQL Build System variabel substitution problem

  4. Varför får jag java.lang.AbstractMethodError:oracle.jdbc.driver.OracleConnection-fel?