Op basis van de opmerkingen zal ik proberen hier te antwoorden.
Ik denk dat je moet gaan met de postgres 11-alpine afbeelding. En ik zal hier proberen uit te leggen waarom.
Officiële docker-afbeeldingen hebben een aantal voordelen die u altijd moet overwegen voordat u uw eigen afbeeldingen begint.
- Upgradepad is eenvoudig - wanneer een nieuwe revisie van de applicatie die in de afbeelding is verpakt, wordt vrijgegeven, wordt in de meeste gevallen ook de officiële docker-afbeelding bijgewerkt. En meestal respecteren de wijzigingen de configuratieconventies die de afbeelding heeft vastgesteld. Zoals omgevingsvariabelen, opstartspecificaties. Zodat gebruikers eenvoudig de tag in hun stapels kunnen wijzigen en upgraden. Er kunnen natuurlijk belangrijke wijzigingen zijn - controleer dit altijd.
- Groot gebruikersbestand - wanneer afbeeldingen zoals postgres meer dan 10 miljoen keer (2019) zijn gedownload, betekent dit niet alleen dat het populair is, maar werkt het ook als een garantie dat de afbeelding grondig is getest. Alle elementaire bugs zijn al verwijderd, en je zult een gemakkelijke tijd hebben met de afbeelding.
- Geoptimaliseerd voor grootte en prestaties - u kunt er zeker van zijn dat er aandacht is besteed aan veel details, het minimaliseren van de grootte van het beeld en het maximaliseren van de prestaties. Veel projecten publiceren hun applicaties op een paar verschillende Linux-distributies. Net als postgres - ze publiceren
debian
en eenalpine
gebaseerde afbeeldingen. Dealpine
afbeelding is de kleinere, terwijl dedebian
is iets groter, maar geeft u toegang tot de uitgebreide pakketbronnen van debian als u extra pakketten moet installeren. - Eenvoudige configuratie - beheerders van de officiële afbeeldingen begrijpen dat usecases van hun gebruikersbestand meestal heel goed. En ze proberen ons leven als ontwikkelaars en beheerders gemakkelijker te maken (God zegene hen). Officiële afbeeldingen hebben meestal behoorlijk goede documentatie op de bestemmingspagina van hun docker-hub, of een link naar een github-repo waar de
README.md
zal betrekking hebben op veelvoorkomende toepassingen. Ik vind dat deze instructies de moeite waard zijn om van boven naar beneden goed te lezen.
Ik begrijp dat je de afbeelding klein wilt houden, maar wat weet je:het postgres-project heeft je usecase gedekt.
De laatste afbeelding van alpine postgres getagd met 11-alpine
heeft een gecomprimeerde voetafdruk van 28 MB en gedecomprimeerd van 70 MB . Terwijl de archlinux/base
afbeelding waarmee u wilt beginnen, heeft een gecomprimeerde basisvoetafdruk van 153 MB en een gedecomprimeerde grootte van 445MB . En dat is voordat je postgres zelf introduceert.
Voeg daar nog aan toe dat de database en gebruiker die u wilt maken bij het opstarten - alleen in de omgevingsvariabelen kunnen worden afgehandeld voor de officiële postgres-afbeelding. Zoals dit:
docker run -d --name some-postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-e POSTGRES_USER=simha \
-e POSTGRES_DB=btgapp \
postgres:11-alpine
Als dat niet de initialisatie dekt die je nodig hebt voor je database, dan kun je .sql
kopiëren. scripts (en .sh
scripts) naar een speciale locatie in de afbeelding - en ze worden uitgevoerd bij het opstarten. Hiervoor kun je hun afbeelding als volgt uitbreiden:
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
En dan met een Dockerfile
zoals dit:
Dockerfile
FROM postgres:11-alpine
COPY ./init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh
(Dit is overgenomen uit de postgres-beschrijving op docker-hub )
Tot slot - ik zou aanraden dat je geen prioriteit geeft aan de distro waarop een afbeelding is gebaseerd boven de bruikbaarheid en onderhoudbaarheid. Docker stelt ons in staat om applicaties in containers uit te voeren zonder ons echt te bekommeren om welke distro zich in de container bevindt. Het is toch allemaal Linux. Aan het eind van de dag verwacht ik dat je een stabiele postgres-databasecontainer wilt zoals ik. Dit krijg ik met de officiële postgres-afbeelding.
Ik hoop dat ik je geholpen heb om je opties hierin te evalueren.