sql >> データベース >  >> RDS >> PostgreSQL

Dockerイメージの構築中にPostgresdumpを復元するにはどうすればよいですか?

    これは、example.pgダンプファイルを提供することにより、次のDockerfileで実行できます。

    FROM postgres:9.6.16-alpine
    
    LABEL maintainer="[email protected]"
    LABEL org="Cobrainer GmbH"
    
    ARG PG_POSTGRES_PWD=postgres
    ARG DBUSER=someuser
    ARG [email protected]
    ARG DBNAME=sampledb
    ARG DB_DUMP_FILE=example.pg
    
    ENV POSTGRES_DB launchpad
    ENV POSTGRES_USER postgres
    ENV POSTGRES_PASSWORD ${PG_POSTGRES_PWD}
    ENV PGDATA /pgdata
    
    COPY wait-for-pg-isready.sh /tmp/wait-for-pg-isready.sh
    COPY ${DB_DUMP_FILE} /tmp/pgdump.pg
    
    RUN set -e && \
        nohup bash -c "docker-entrypoint.sh postgres &" && \
        /tmp/wait-for-pg-isready.sh && \
        psql -U postgres -c "CREATE USER ${DBUSER} WITH SUPERUSER CREATEDB CREATEROLE ENCRYPTED PASSWORD '${DBUSER_PWD}';" && \
        psql -U ${DBUSER} -d ${POSTGRES_DB} -c "CREATE DATABASE ${DBNAME} TEMPLATE template0;" && \
        pg_restore -v --no-owner --role=${DBUSER} --exit-on-error -U ${DBUSER} -d ${DBNAME} /tmp/pgdump.pg && \
        psql -U postgres -c "ALTER USER ${DBUSER} WITH NOSUPERUSER;" && \
        rm -rf /tmp/pgdump.pg
    
    HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
      CMD pg_isready -U postgres -d launchpad
    

    ここで、wait-for-pg-isready.sh は:

    #!/bin/bash
    set -e
    
    get_non_lo_ip() {
      local _ip _non_lo_ip _line _nl=$'\n'
      while IFS=$': \t' read -a _line ;do
        [ -z "${_line%inet}" ] &&
            _ip=${_line[${#_line[1]}>4?1:2]} &&
            [ "${_ip#127.0.0.1}" ] && _non_lo_ip=$_ip
        done< <(LANG=C /sbin/ifconfig)
      printf ${1+-v} $1 "%s${_nl:0:$[${#1}>0?0:1]}" $_non_lo_ip
    }
    
    get_non_lo_ip NON_LO_IP
    until pg_isready -h $NON_LO_IP -U "postgres" -d "launchpad"; do
      >&2 echo "Postgres is not ready - sleeping..."
      sleep 4
    done
    
    >&2 echo "Postgres is up - you can execute commands now"
    

    2つの「不明なステップ」の場合:

    nohup bash -c "docker-entrypoint.sh postgres &" 世話をすることができます

    本当に必要ではありません

    上記のスクリプトと詳細なREADMEは、 https://githubで入手できます。 .com / cobrainer / pg-docker-with-restored-db



    1. 長期プロジェクトでのタイムゾーンの導入についての詳細

    2. SQLクエリでのタイムゾーン変換

    3. POSTGRESは、指定された値が配列型の列に存在するかどうかを確認します

    4. java.lang.ClassCastException:oracle.sql.BLOBをoracle.sql.BLOBにキャストできません