在 docker 上 运行 时 PostgreSQL 不创建表

PostgreSQL not creating tables when running on docker

我正在尝试 运行 我的 Windows 服务器中的 linux 容器 docker 上的 PostgreSQL,但是当我 运行 它时,它会创建数据库,但没有 table 并且其中没有数据,而它应该创建所有 table 并使用 Actibook_latest.sql

向其中添加数据

这是Dockerfile

的代码
# Dockerfile
FROM postgres:9.4

RUN mkdir -p /tmp/psql_data/

COPY Actibook_latest.sql /tmp/psql_data/
COPY init_docker_postgres.sh /docker-entrypoint-initdb.d/

EXPOSE 5432

这是init_docker_postgres.sh

的代码
#!/bin/bash
# this script is run when the docker container is built
# it imports the base database structure and create the database for the tests
DATABASE_NAME="postgres"
DB_DUMP_LOCATION="/tmp/psql_data/Actibook_latest.sql"

echo "*** CREATING DATABASE ***"

psql "$DATABASE_NAME" < "$DB_DUMP_LOCATION";

echo "*** DATABASE CREATED! ***"

这里是 docker-compose

的代码
version: '2'

services:
 db:
    build: '.\Main Database Backup'
    environment:
      POSTGRES_DB: ${DB_POSTGRES_APP_DATABASE}
      POSTGRES_USER: ${DB_POSTGRES_APP_USER}
      POSTGRES_PASSWORD: ${DB_POSTGRES_APP_PASSW}
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    restart: unless-stopped

Main Database Backup 是包含该 Dockerfile 和 init_docker_postgres.sh 的文件夹。 Actibook_latest.sql 还包含 sql 以创建 table、数据等

当我 运行 docker-compose up 而其他服务上升并 运行ning 时,这是它向日志显示的内容:

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data/pgdata ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/data/pgdata/base/1 ... ok
initializing pg_authid ... ok
setting password ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    postgres -D /var/lib/postgresql/data/pgdata
or
    pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start

waiting for server to start....LOG:  database system was shut down at 2018-11-14 16:18:07 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
 done
server started

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init_docker_postgres.sh
/usr/local/bin/docker-entrypoint.sh: /docker-entrypoint-initdb.d/init_docker_postgres.sh: /bin/bash^M: bad interpreter: No such file or directory
LOG:  database system was interrupted; last known up at 2018-11-14 16:18:16 UTC
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/16A4780
LOG:  redo is not required
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

我认为可能存在防火墙问题,因为它 运行 在我拥有的其他服务器上完美运行,问题只出现在这台服务器上。那么这台机器中的 postgresql 是否有可能阻止它?

更新

我尝试重新启动 docker 然后使用了这些命令:

docker rm $(docker ps -a -q)
docker rmi $(docker images -a -q)
docker volume rm $(docker volume ls -q)

现在显示此错误:

/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init_docker_postgres.sh
*** CREATING DATABASE ***
: No such file or directory/init_docker_postgres.sh: line 4: /tmp/psql_data/Actibook_latest.sql
/docker-entrypoint-initdb.d/init_docker_postgres.sh: line 4: $'\r': command not found
*** DATABASE CREATED! ***

当我去 docker 检查文件时:

docker exec -it db bin
cd /tmp/psql_data 
ls

表示存在Actibook_latest.sql

您的入口点初始化脚本似乎无法正常工作,请确保 data_volume 在您的容器 运行 之前为空。

这是因为在docker-entrypoint.sh的第57行,它会检查你的数据量,如果存在,它不会执行你的init scrip。