如何保持对Postgresql Docker容器所做的更改?

时间:2017-12-13 17:51:25

标签: postgresql docker

我使用官方的postgresql docker镜像来启动容器。

之后,我安装了一些软件并使用psql创建了一些表格等。我这样做是首先启动postgres容器,如下所示:

docker run -it  --name="pgtestcontainer" -e POSTGRES_PASSWORD=postgres -p 5432:5432 postgres:9.6.6

然后我用

附加到这个容器
docker  exec -it pgtestcontainer bash

我安装软件,创建数据库表等。

之后,我首先从第二个终端会话(我以前安装软件)退出并在第一个会话中执行ctrl + c以停止postgres容器。

此时我的期望是,如果我用

提交这个postgres图像
docker commit xyz...zxy pg-commit-test

然后使用以下命令运行基于已提交映像的新容器:

docker run -it  --name="modifiedcontainer" -e POSTGRES_PASSWORD=postgres -p 5432:5432 pg-commit-test

然后我应该有所有的软件和表格。

上述过程的结果是我安装的软件位于修改后的容器中,但sql表等已经消失。所以我的猜测是我的方法或多或少是正确的,但有一些特定的postgres docker图像我没有。

我知道如果没有绑定外部目录或docker卷,它会从头开始创建db /var/lib/postgresql/data 但我没有这样做,在提交之后,我希望db的内容保持不变。

如何按照上述(或正确的程序)执行并保留对数据库的更改?

3 个答案:

答案 0 :(得分:0)

在我看来,最好的方法是使用/docker-entrypoint-initdb.d文件夹和里面的脚本创建自己的图像。 看How to extend this image

但是如果没有音量,你就不能(我认为)保存你的数据。

答案 1 :(得分:0)

postgres Dockerfile在/ var / lib / postgresql / data创建一个挂载点,如果你想要持久数据,你必须挂载一个外部卷。

Vec = pygame.math.Vector2
VEL = Vec(0, 0)

WHITE = (255, 255, 255)
BLACK = (0,0,0,0)
clock = pygame.time.Clock()
FPS = 40

sprite = pygame.draw.circle(DS,WHITE,[500,250],20,10)
pygame.init()
class Sprite(object):
    def __init__(self):
        self._image = sprite
        self._vx = 0
        self._vy = 0


    def update(self):
        self._vx = 0
        key = pygame.key.get_pressed()

        if key[K_RIGHT]:
            self._vx = -5
        if key[K_LEFT]:
            self._vx = 5

        self._spritex = self._vx
        self._spritey = self._vy

Jumping = True
while Jumping:
        events()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                Jumping = False
        keys = pygame.key.get_pressed()
        if keys[K_LEFT]:
            sprite.left = sprite.left + PLAYER_ACC - 5
        if keys[K_RIGHT]:
            sprite.right = sprite.right + PLAYER_ACC + 5


            DS.fill(WHITE, sprite)


        pygame.display.flip()

        clock.tick(FPS)

https://docs.docker.com/engine/reference/builder/#notes-about-specifying-volumes

您可以使用

创建一个卷
ENV PGDATA /var/lib/postgresql/data
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)
VOLUME /var/lib/postgresql/data

然后你可以在你的容器中使用它

docker volume create mydb

https://docs.docker.com/engine/admin/volumes/volumes/#create-and-manage-volumes

答案 2 :(得分:0)

我通过传递PGDATA参数来解决这个问题,该参数的值与绑定到Docker卷的路径不同,如this question的响应之一所示。