首页 > 解决方案 > 在 docker 启动时应用迁移脚本

问题描述

我无法在 docker 启动时使用模式演化管理器初始化数据库。我的docker文件如下

FROM postgres:10-alpine

WORKDIR /opt/ext-api-db
COPY . .

RUN apk add py-pip ruby ruby-rdoc
RUN gem install schema-evolution-manager && \
    pip install awscli

RUN cp docker-entrypoint-initdb.d/* /docker-entrypoint-initdb.d

EXPOSE 5432

docker-entrypoint-initdb.d 包含一个初始化脚本

set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE DATABASE ${POSTGRES_USER}_test;
    GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_USER}_test TO $POSTGRES_USER;
EOSQL

# Applying Sem Scripts
echo
echo 'PostgreSQL initialzing Data...'
echo

"pg_ctl -o" -c listen_addresses='localhost'" -D "$PGDATA" -w restart"

sem-apply --url postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost/$POSTGRES_DB
sem-apply --url postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost/$POSTGRES_DB_test

在 docker 容器启动时,数据库创建良好,但模式演变管理器说它无法连接到数据库这是完整的堆栈跟踪

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sh
CREATE DATABASE
GRANT

PostgreSQL initialzing Data...

psql: could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Address not available
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432?
/usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/library.rb:136:in `rescue in system_or_error': Error running command[psql --no-align --tuples-only --no-psqlrc --command "select count(*) from pg_namespace where nspname='schema_evolution_manager'" postgresql://user:pass@localhost/db]: Non zero exit code[pid 47 exit 2] running command[psql --no-align --tuples-only --no-psqlrc --command "select count(*) from pg_namespace where nspname='schema_evolution_manager'" postgresql://user:pass@localhost/db] (RuntimeError)
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/library.rb:129:in `system_or_error'
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/db.rb:32:in `psql_command'
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/db.rb:90:in `schema_schema_evolution_manager_exists?'
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/scripts.rb:86:in `scripts_previously_run'
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/scripts.rb:48:in `each_pending'
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/lib/schema-evolution-manager/db.rb:22:in `bootstrap!'
    from /usr/lib/ruby/gems/2.5.0/gems/schema-evolution-manager-0.9.39/bin/sem-apply:30:in `<top (required)>'
    from /usr/bin/sem-apply:23:in `load'
    from /usr/bin/sem-apply:23:in `<main>'

这是我的 docker-compose 配置

version: "3"
services:
  ext-api-db:
    build:
      context: .
    container_name: ext-api-db
    env_file: docker-compose.env
    hostname: ext-api-db
    networks:
      - ext
    ports:
      - "15432:5432"
    restart: unless-stopped
    volumes:
      - .:/opt/ext-api-db:delegated
networks:
  ext:
    external:
      name: ext

有人可以告诉我如何解决这个问题吗?

标签: postgresqldockerdocker-composedatabase-migration

解决方案


您的入口点脚本应该是:

set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL
    CREATE DATABASE ${POSTGRES_USER}_test;
    GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_USER}_test TO $POSTGRES_USER;
EOSQL

# Applying Sem Scripts
echo
echo 'PostgreSQL initialzing Data...'
echo

pg_ctl -o "-c listen_addresses='localhost'" -D "$PGDATA" -w restart

echo Server restarted with TCP/IP enabled

sem-apply --url postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost/$POSTGRES_DB
sem-apply --url postgresql://$POSTGRES_USER:$POSTGRES_PASSWORD@localhost/$POSTGRES_DB_test

推荐阅读