Î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?