我正在学习使用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
如您所见,该表不存在。请指出这里的错误是什么。
答案 0 :(得分:0)
清理/var/lib/postgresql/data
卷中的文件/文件夹并创建一个容器。
答案 1 :(得分:0)
这是the standard postgres image的功能;如果您将PostgreSQL手动安装在一个普通的Ubuntu容器中,则不会获得任何帮助。
如果为此构建自定义映像,则可以从该映像开始并添加初始化文件。这是一个完整的Dockerfile:
FROM postgres:9.6
COPY ./scripts/test.sql /docker-entrypoint-initdb.d/
我可能不会为此构建自定义图像。相反,您可以使用docker run -v
选项或Docker Compose volumes:
选项在脚本启动时将脚本推送到容器中(将其作为配置文件进行处理)。
(还要记住,这些初始化脚本仅在数据库容器启动时第一次运行;如果已经有数据库数据,它们将不会重新运行。)