码头停止&& docker rm并没有真正摆脱我的容器

时间:2015-06-30 09:58:12

标签: postgresql docker vagrant

使用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容器并启动一个新容器需要更长的时间。

1 个答案:

答案 0 :(得分:3)

您获得了一个新容器,但-v /data:/var/lib/postgresql/data将主机的/data目录安装到容器中,从而在容器之间对数据库进行持久更改。如果省略,数据库将被隔离在容器中,并在删除容器后立即消失。

有关详细信息,请参阅Managing data in containers (Docker documentation)

相关问题