我想构建用于测试某些问题的postgres docker容器。我有:
postgres文件的存档文件夹(/var/lib/postgres/data/
)
将文件夹放入doccker postgres:latest的Dockerfile。
我想要:
Docker映像,在重新创建映像后会重置自身状态。
具有基于数据库状态的容器传递到容器postgres文件中
我不想等待长时间的备份操作并使用/docker-entrypoint-initdb.d
初始化脚本还原现有数据库。
我不想使用卷,因为我不需要在重新启动之间存储新数据(这就是为什么该文章不同于如何将PostgreSQL容器与现有数据一起使用?。
我的建议是在构建阶段将postgres files(/var/lib/postgres/data/
)从主机复制到docker的/var/lib/postgres/data/
。
但是在initdb阶段执行时,postgres docker会替换此文件。
如何要求Postgres docker不覆盖数据库文件?
例如Dockerfile
FROM postgres:latest
COPY ./postgres-data.tar.gz /opt/pg-data/
WORKDIR /opt/pg-data
RUN tar -xzf postgres-data.tar.gz
RUN mv ./data/ /var/lib/postgresql/data/pg-data/
运行命令
docker run -p 5432:5432 -e PGDATA=/var/lib/postgresql/data/pg-data --name database-immage1 database-docker
如果您确实不需要使用数据库快照创建自定义映像,则可以使用卷。解压主机上某处的数据库文件,~/pgdata
然后运行映像。例:
docker run -v ~/pgdata:/var/lib/postgresql/data/ -p 5432:5432 postgres:9.5
这些文件必须与postgres
映像的版本兼容,因此使用与存档数据库相同的映像版本。
相反,如果必须重新创建映像,则不需要解压缩数据库存档。该ADD
说明将为您做到这一点。确保tar不包含任何前导目录。
的Dockerfile
:
FROM postgres:latest
ADD ./postgres-data.tar.gz /var/lib/postgresql/data/
建立它:
docker build . -t database-docker
运行时不覆盖环境变量PGDATA
。请注意,您将文件复制到,/var/lib/postgresql/data
但PGDATA
指向/var/lib/postgresql/data/pg-data
。
运行容器:
docker run -p 5432:5432 --name database-image1 database-docker
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句