假设我有一个docker-compose.yaml
文件,其中包含postgres 9.1服务:
postgres:
image: postgres:9.1
如果它升级到postgres 9.4,数据库中的数据会丢失吗?即,卷将被销毁并重新创建吗?
答案 0 :(得分:0)
数据不会被销毁。 {@ 1}}容器将被销毁并重新创建,但将迁移到依赖容器的链接。困难的部分实际上是迁移数据。
恢复旧版postgres并拍摄快照。 确保生成的postgres
包含合理的数据,否则您将面临失去所有内容的风险。
migration.psql
从卷中删除旧的数据库文件
sed -i -e 's/postgres:9.*$/postgres:9.1/g' docker-compose.yml
sudo docker-compose up -d postgres
sudo docker-compose run --rm dbadmin pg_dumpall > migration.psql
升级到新的postgres并恢复快照
sudo docker-compose stop postgres
sudo docker run --rm --volumes-from scratch_postgres_1 postgres:9.6 bash -c "rm -r /var/lib/postgresql/data/*"
详情如下。
我们可以通过让sed -i -e 's/postgres:9.*$/postgres:9.4/g' docker-compose.yml
sudo docker-compose up -d postgres
sudo docker-compose run --rm dbadmin psql < migration.psql
服务使用dbadmin
服务来测试这一点。
postgres
启动这两项服务并创建一个表。
postgres:
image: postgres:9.1
dbadmin:
image: postgres:9.4
links:
- postgres
environment:
PGHOST: postgres
PGUSER: postgres
PGDATABASE: postgres
PGPASSWORD: postgres
volumes:
- ./backup:/backup
command: bash -c "while true; do sleep 1; done"
docker-compose up -d docker ps --format "{{.ID}}\t{{.Image}}\t{{.Names}}" docker-compose exec dbadmin psql -tc "SHOW server_version" docker-compose exec dbadmin psql -tc "CREATE TABLE foo (bar int);"
升级服务:
fb905d183992 postgres:9.4 scratch_dbadmin_1
9316b431a369 postgres:9.1 scratch_postgres_1
9.1.24
CREATE TABLE
桌子还在吗?
postgres:
- image: postgres:9.1
+ image: postgres:9.4
docker-compose exec dbadmin psql -tc "\d"
是的,但服务仍未使用版本9.4:
public | foo | table | postgres
docker ps --format "{{.ID}}\t{{.Image}}\t{{.Names}}"
fb905d183992 postgres:9.4 scratch_dbadmin_1
9316b431a369 postgres:9.1 scratch_postgres_1
docker-compose up -d postgres docker-compose logs postgres
这看起来是个好消息:postgres找到了一个数据库,但版本错误。由于迁移不是自动的,所以有点痛苦。
警告这可能会破坏您的数据。只使用这个小测试项目运行这些命令。
首先再次降级至9.1。然后使用Recreating scratch_postgres_1
postgres_1 | LOG: skipping missing configuration file "/var/lib/postgresql/data/postgresql.auto.conf"
postgres_1 | FATAL: database files are incompatible with server
postgres_1 | DETAIL: The data directory was initialized by PostgreSQL version 9.1, which is not compatible with this version 9.4.10.
服务进行备份。
dbadmin
删除卷的内容:
docker-compose up -d postgres
docker-compose exec dbadmin pg_dumpall > migration.psql
再次升级到9.4。因为我们销毁了数据库,所以这将创建一个新数据库。然后使用docker-compose stop postgres
docker run --rm --volumes-from scratch_postgres_1 postgres:9.1 \
bash -c "rm -r /var/lib/postgresql/data/*"
服务导入备份。
dbadmin
docker-compose up -d postgres docker-compose exec dbadmin psql < migration.psql docker-compose exec dbadmin psql -tc "\d" docker-compose exec dbadmin psql -tc "SHOW server_version" docker ps --format "{{.ID}}\t{{.Image}}\t{{.Names}}"
请注意,public | foo | table | postgres
9.4.10
9bf94397f89c postgres:9.4 scratch_postgres_1
fb905d183992 postgres:9.4 scratch_dbadmin_1
的容器ID是相同的,因此它是相同的容器 - 但是,它现在链接到已升级的dbadmin
容器(已重新创建)。