簡體   English   中英

在已包含在DockerFile中的postgresql docker中運行sql腳本

[英]run sql script in postgresql docker have included in DockerFile

我正在學習使用docker,我的目標是創建一個postgres sql容器,在其中創建一個表,到目前為止,我不想添加任何數據即可創建表。 我能夠創建一個postgres sql實例,但是將我的sql腳本(創建此表)復制/添加到/docker-entrypoint-initdb.d/似乎不起作用。 我可以在運行psql db時確認這一點,但看不到任何創建的表。

我的Dockerfile

"FROM ubuntu

RUN apt-get update && apt-get install -y gnupg

RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8

RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list


RUN apt-get update && apt-get install -y   postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3

USER postgres

RUN    /etc/init.d/postgresql start &&\
    psql --command "CREATE USER docker WITH SUPERUSER PASSWORD 'docker';" &&\
    createdb -O docker docker

RUN echo "host all  all    0.0.0.0/0  md5" >> /etc/postgresql/9.3/main/pg_hba.conf

RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf

EXPOSE 5432

VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]


copy /scripts/test.sql /docker-entrypoint-initdb.d/

CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]"

我的SQL文件

CREATE TABLE email_confirmation_code (
id integer NOT NULL,
code character varying(255) NOT NULL,
user_id integer
);

測試

psql -h localhost -p 32772 -U docker --password
Password for user docker: 
psql (10.6 (Ubuntu 10.6-1.pgdg16.04+1), server 9.3.17)
SSL connection (protocol: TLSv1.2, cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

docker=# select * from email_confirmation_code
docker-# ;
ERROR:  relation "email_confirmation_code" does not exist
LINE 1: select * from email_confirmation_code

如您所見,該表不存在。 請指出這里的錯誤是什么。

清理/var/lib/postgresql/data卷中的文件/文件夾並創建一個容器。

這是標准postgres圖像的功能 如果您在一個普通的Ubuntu容器中手動安裝PostgreSQL,那您將無法獲得。

如果為此構建自定義圖像,則可以從該圖像開始並添加初始化文件。 這是一個完整的Dockerfile:

FROM postgres:9.6
COPY ./scripts/test.sql /docker-entrypoint-initdb.d/

我可能不會為此構建自定義圖像。 相反,您可以使用docker run -v選項或Docker Compose volume volumes:選項將腳本啟動時將腳本推送到容器中(將其作為配置文件進行處理)。

(還要記住,這些初始化腳本僅在數據庫容器第一次啟動時運行;如果已經有數據庫數據,它們將不會重新運行。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM