postgresql - 在 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
有人可以告诉我如何解决这个问题吗?
解决方案
您的入口点脚本应该是:
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
推荐阅读
- google-sheets - 如果满足条件,则向单元格添加值
- android - Flutter:有没有更好的方法来编写以下代码?
- c++ - MSVC 的标准库没有为 std::string、std::shared_ptr 等定义 spaceship 运算符?
- helix-3d-toolkit - 如何在没有 .cs 的 WPF 中使用 xaml 文件
- bash - 删除文本文件中 \ 的最后一个实例
- python-3.x - pip3 软件包已安装在 /home/user/.local/python3.8/site-packages/ 但根本无法使用它们
- flutter - 无法从 Flutter Web 读取 .txt 文件
- r - 如何按组记录观察的第一个实例?
- python - 不匹配的输入 ',' 期望 ')'
- css - With Bootstrap 4 I am able to fix top navbar on scrolling how can i make one more line below it fixed even in normal css