使用postgres图片时,我有一些奇怪的行为。
我创建了一个挂载到/docker-entrypoint-initdb.d
并使用单用户模式初始化数据库的脚本。
但是,当我更新脚本时,请运行
docker stop postgres_db
docker rm postgres_db
并且比启动一个新容器,数据库是旧的。它不会改变。
我正在使用vagrant box-cutter/ubuntu1404-docker
并且当我运行
vagrant destroy -f
vagrant up
并重新创建新的docker容器,将应用更改。
为什么在我删除旧容器并开始新容器时它不起作用? docker在哪里保留它的缓存,我可以清除它以真正获得一个新的图像?
更新
我正在使用的确切docker文件是原始文件的一个小扩展。它只是安装了orafce插件link,内容:
FROM postgres:9.4
RUN apt-get update && \
apt-get install -y postgresql-9.4-orafce && \
rm -rf /var/lib/apt/lists/*
我用来启动新容器的命令是:
docker run --name="postgres_db" \
--restart="always" \
-e POSTGRES_PASSWORD=PostgresPassword \
-p 5432:5432 \
-v /data:/var/lib/postgresql/data \
-v /vagrant/container_data/init_scripts:/docker-entrypoint-initdb.d \
-v /vagrant/container_data/tmp:/tmp \
-d grmanit/postgres
init_scripts
文件夹包含一个用于创建新数据库和新用户的脚本。
澄清:
当我更改init_scripts
文件夹中的脚本时,例如修改数据库名称,然后停止+删除旧容器并启动一个新容器,它没有任何效果。
当我更改postgres
的密码时,该密码在docker run
命令中设置为环境变量(在此示例中为PostgresPassword
)并再次停止+删除旧容器而不是用新的环境变量开始新的,它再次没有任何影响。我仍然需要使用旧密码连接到数据库,新的密码将不起作用。
但是当我销毁VM并再次启动它时,我有我之前定义的配置。然而,再次更改它们需要我销毁并重新启动VM,这比仅仅破坏一个docker容器并启动一个新容器需要更长的时间。
答案 0 :(得分:3)
您获得了一个新容器,但-v /data:/var/lib/postgresql/data
将主机的/data
目录安装到容器中,从而在容器之间对数据库进行持久更改。如果省略,数据库将被隔离在容器中,并在删除容器后立即消失。
有关详细信息,请参阅Managing data in containers (Docker documentation)。