如果我在docker-compose中升级图像,它的卷会丢失吗?

时间:2016-11-14 06:43:13

标签: docker-compose

假设我有一个docker-compose.yaml文件,其中包含postgres 9.1服务:

postgres:
    image: postgres:9.1

如果它升级到postgres 9.4,数据库中的数据会丢失吗?即,卷将被销毁并重新创建吗?

1 个答案:

答案 0 :(得分:0)

TL;博士

数据不会被销毁。 {@ 1}}容器将被销毁并重新创建,但将迁移到依赖容器的链接。困难的部分实际上是迁移数据。

  1. 恢复旧版postgres并拍摄快照。 确保生成的postgres包含合理的数据,否则您将面临失去所有内容的风险。

    migration.psql
  2. 从卷中删除旧的数据库文件

    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
    
  3. 升级到新的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/*"
    
  4. 详情如下。

    测试设置

    我们可以通过让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容器(已重新创建)。