在PostgreSQL Docker镜像中创建表格。

26

我是docker的新手。我已经扩展了PostgreSQL镜像并能够在运行镜像时创建新的DB实例。我需要从shell脚本中创建该DB中的表,该脚本将执行.sql文件。在运行PostgreSQL镜像时,它会显示服务器未启动?如何才能在docker容器中仅在PostgreSQL服务器启动后执行脚本?

Dockerfile:

FROM postgres:9.3
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker 
RUN apt-get update && apt-get install -y postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3
ADD initialize.sh /home/MM0312/docker-entrypoint-initdb.d/initialize.sh
CMD ["/home/MM0312/docker-entrypoint-initdb.d/initialize.sh"]

初始化脚本

#!/bin/bash
set -e
set -x

echo "******PostgreSQL initialisation******"
gosu docker psql -h localhost -p 5432 -U docker -d $docker -a -f createDatabase.sql

创建 createDatabase.sql 文件

CREATE TABLE web_origins (
    client_id character varying(36) NOT NULL,
    value character varying(255)
);
1个回答

61
官方Postgres Docker镜像的docker-entrypoint.sh脚本中写道:
psql+=( --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" )

        echo
        for f in /docker-entrypoint-initdb.d/*; do
            case "$f" in
                *.sh)     echo "$0: running $f"; . "$f" ;;
                *.sql)    echo "$0: running $f"; "${psql[@]}" < "$f"; echo ;;
                *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}"; echo ;;
                *)        echo "$0: ignoring $f" ;;
            esac
            echo
done

因此,您想在docker镜像内执行的每个.sql文件都可以放置在该文件夹中。 所以我的dockerfile看起来像这样

FROM postgres:9.3
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
ADD CreateDB.sql /docker-entrypoint-initdb.d/

而我的CreateDB.sql文件的内容如下:

CREATE TABLE web_origins (
    client_id character varying(36) NOT NULL,
    value character varying(255)
);

所以我只需使用以下命令启动容器:

docker run -d my-postgres

查看:

docker exec -it 6250aee43d12 bash
root@6250aee43d12:/# psql -h localhost -p 5432 -U docker -d docker
psql (9.3.13)
Type "help" for help.

docker=# \c
You are now connected to database "docker" as user "docker".
docker=# \dt
           List of relations
 Schema |    Name     | Type  | Owner
--------+-------------+-------+--------
 public | web_origins | table | docker
(1 row)

你可以在这篇博客中查找mysql的详细信息

如何使用Docker Compose处理这个问题? - kamal
1
我们只需要复制这个吗?因为在我的情况下,db.sql已经被复制到docker-entrypoint-initdb.d目录中,但是SQL命令没有运行。 - kamal
1
@kamal 如果您使用Docker Compose和官方的Postgres镜像,并且想要在运行时创建一个资源(而不是在镜像中),则必须使用以下命令:- ./init.sql:/docker-entrypoint-initdb.d/init.sql,如此处所述:https://gist.github.com/onjin/2dd3cc52ef79069de1faa2dfd456c945 - lvthillo
我已经完成了,postgres: image: onjin/alpine-postgres:9.5 volumes: - ./testdata/db.sql:/docker-entrypoint-initdb.d/db.sql restart: unless-stopped ports: - "5432:5432",但仍未执行。 - kamal
@kamal 如果你正在使用 -d 标志,你可以将其删除以查找更多的调试日志。在我的情况下,我发现第四种情况 "$0: ignoring $f" 被回显,然后我就能从那里追踪到根本原因了。 - akki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接