在Dockerfile中创建的数据库不会出现在正在运行的容器中

时间:2014-04-15 09:57:10

标签: postgresql docker

我已根据https://index.docker.io/u/nornagon/postgres/图片创建了一个Dockerfile。我想创建一个Postgres数据库docker镜像作为CI过程的一部分。

这是我的Dockerfile:

FROM nornagon/postgres

ADD sql sql
ADD create_db.sh /src/

USER postgres

RUN /src/create_db.sh

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"]

以下是RUN命令执行的create_db.sh bash脚本:

#! /bin/bash

/etc/init.d/postgresql start

psql --command "CREATE USER queuespy WITH SUPERUSER PASSWORD 'queuespy';"

createdb -O queuespy queuespy

psql -l

for i in /sql/tables/*.sql
do
    psql --file=$i --dbname=queuespy
done

for i in /sql/static_data/*.sql
do
    psql --file=$i --dbname=queuespy
done

/etc/init.d/postgresql stop

当我构建Dockerfile时,一切似乎都运行正常。我得到这个输出显示psql命令都成功执行:

$ docker build -t queuespy/db .
Uploading context 45.57 kB
Uploading context 
Step 0 : FROM nornagon/postgres
 ---> b60632eb52bf
Step 1 : MAINTAINER mike@suteki.co.uk
 ---> Using cache
 ---> 75fd9054927f
Step 2 : ADD sql sql
 ---> Using cache
 ---> 3c1bfe677e42
Step 3 : ADD create_db.sh /src/
 ---> bef6f8729c2a
Step 4 : USER postgres
 ---> Running in 4280e300d7f3
 ---> ce7a940abcd7
Step 5 : RUN /src/create_db.sh
 ---> Running in 196ead143566
uid=102(postgres) gid=105(postgres) groups=105(postgres),104(ssl-cert)
 * Starting PostgreSQL 9.3 database server
   ...done.
CREATE ROLE
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 docker    | docker   | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 queuespy  | queuespy | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
 * Stopping PostgreSQL 9.3 database server
   ...done.
 ---> 882102c8256c
Successfully built 882102c8256c

我可以运行图像OK:

$ docker run -d -p 5432:5432 --name queuespy_db queuespy/db

但是当我列出数据库和用户时,没有我在Dockerfile中创建的数据的迹象,只有在nornagon / postgres图像中创建的docker用户?

1 个答案:

答案 0 :(得分:3)

问题是数据目录的默认位置是基本映像中的configured as a VOLUME。在您发布问题后,维护人员似乎立即对此进行了更改。就图像提交而言,Docker会忽略VOLUME目录中文件系统的更改。

我使用stackbrew Postgres图片遇到了这个问题。为了能够创建包含postgres +自定义模式的新图像,需要一个新的非VOLUME数据目录。 Postgres还需要配置为使用此目录。在stackbrew的版本中,这就像覆盖自定义Dockerfile中的PGDATA环境变量一样简单:

FROM postgres
# Original 'PGDATA' is /var/lib/postgresql/data
RUN mkdir -p /var/lib/pgdata
ENV PGDATA /var/lib/pgdata
# RUN ... logic to create schema