我已根据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用户?
答案 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