我使用官方的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的内容保持不变。
如何按照上述(或正确的程序)执行并保留对数据库的更改?
答案 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的响应之一所示。