Puncte:0

De ce containerul meu nu conține date DB după ce le commit?

drapel fr

Încerc să creez un container PostgreSQL care conține deja date de dezvoltare. Pot vedea datele pe care le-am creat, dar când eu comite, Apăsaţi, și Trage imaginea, datele nu sunt acolo.

Mai jos este fișierul meu Docker:

DIN postgis/postgis:11-2.5
MAINTENER Eu

# Conținutul lui 20-init_db.sql:
# CREATE EXTENSIE DACA NU EXISTĂ btree_gist;
# CREATE EXTENSIE DACA NU EXISTA hstore;
COPIEAZĂ ./20-init_db.sql /docker-entrypoint-initdb.d/20-init_db.sql
COPY ./make_data.sh /make_data.sh

Creez containerul folosind scriptul de mai jos, iar datele sunt populate cu succes.

#!/bin/bash

aws ecr get-login-password --region us-east-1 | \
    docker login --username AWS --password-stdin 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com

aws ecr create-repository --repository-name dev_postgres --region us-east-1

# Asigurați-vă că mediul de construcție este curat
docker stop dev_postgres_container
docker rm dev_postgres_container
docker rmi dev_postgres_img

# Pregătiți recipientul
docker build -f postgres.Dockerfile -t dev_postgres_img .
docker run -d --name dev_postgres_container \
    -e POSTGRES_DB=baza_de_date\
    -e POSTGRES_USER=utilizatorul_\
    -e POSTGRES_PASSWORD=parola\
    -e PGDATA=/var/lib/postgresql/data/pgdata
    dev_postgres_img
docker exec -it dev_postgres_container bash /make_data.sh

###
### Acesta returnează numărul corect de utilizatori, deci există date în container în acest moment.
###
docker exec -it dev_postgres_container /usr/bin/psql -U the_user the_database -c "select count(*) from auth_user;"

# Angajați starea containerului și salvați-o în Amazon ECR:
docker commit $(docker ps -q --filter "name=dev_postgres_container") 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:11-2.5-with-data

# De asemenea, etichetați-l cu „latest” și marca temporală
etichetă docker 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:11-2.5-with-data 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data
etichetă docker 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:11-2.5-with-data 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:$( date -u +%Y%m%d_%H%MZ )-cu-date

# Apăsaţi
docker push 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres --all-tags

Cu toate acestea, când trag containerul într-un mediu izolat, nu există date:

brew instalează virtualbox
brew install multipass
sudo multipass set local.driver=virtualbox
lansare multipass --name ubuntu2
montare multipass ~/.aws ubuntu2:/home/ubuntu/.aws
montare multipass ./db ubuntu2:/home/ubuntu/db
multipass exec ubuntu2 -- bash /home/ubuntu/db/test_db_container.sh

### Conținutul test_db_container.sh este mai jos: ###

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

sudo apt-get install -y awscli

# Trageți containerul Docker:
aws ecr get-login-password --region us-east-1 | \
    sudo docker login --username AWS --password-stdin 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com
sudo docker pull 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data

sudo docker run -d --name the_db 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data

###
### Tabelul auth_user nu există.
###
sudo docker exec -it the_db /usr/bin/psql -U the_user the_database -c "select count(*) from auth_user;"

istoric sudo docker 23456789JQKA.dkr.ecr.us-east-1.amazonaws.com/dev_postgres:latest-with-data

## Rezultat:
IMAGINE CREAȚĂ CREAȚĂ PRIN DIMENSIUNE COMENTARIU
854dbef239c2 acum 23 de ore postgres 70B
4b1bd66a8d33 acum 23 ore COPY ./make_data.sh /make_data.sh 3.03kB buildkit.dockerfile.v0
<lipsing> acum 23 de ore COPY ./20-init_db.sql /docker-entrypoint-ini⦠188B buildkit.dockerfile.v0
<lipsing> acum 23 de ore MAINTENER Me 0B buildkit.dockerfile.v0
[...]

Notă secundară: m-am gândit să creez un container de volum de date, dar această metodă mi s-a părut mai simplă și mai bine documentată.

O altă notă laterală: nu pot adăuga datele în fișierul Docker, deoarece Postgres trebuie să ruleze înainte ca datele să poată fi inserate.

De ce nu este docker commit salvează starea containerului meu? De ce imaginea nu conține date?

mreferre avatar
drapel nl
Este probabil pentru că volumul de date este un .... volum. Vedeți [aici](https://stackoverflow.com/questions/27377876/docker-postgres-with-initial-data-is-not-persisted-over-commits)
Travis avatar
drapel fr
Da, asta era problema.Nu mi-am dat seama că setul de containere PostgreSQL `/var/lib/postgresql/data` ca volum. Soluția este [aici](https://stackoverflow.com/a/29956964/1477364), deși cu cât citesc mai mult, cu atât mai mult pare că un container numai pentru date este cea mai bună practică pentru asta. (Postați comentariul dvs. ca răspuns și îl voi accepta.)
mreferre avatar
drapel nl
Rece. Ma bucur sa aud asta. Terminat.
Puncte:1
drapel nl

Conform comentariilor de sub threadul principal, soluția a fost similară cu cea sugerată în aceasta existenta Răspuns. Se rezumă la faptul că directorul de date este un volum și, prin urmare, trăiește în afara contextului containerului care este modificat/comitat.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.