docker-compose 后加载 Postgres 转储
Load Postgres dump after docker-compose up
我有一个 dump.sql 文件,我想用 docker-compose 加载它。
docker-compose.yml:
services:
postgres:
environment:
POSTGRES_DB: my_db_name
POSTGRES_USER: my_name
POSTGRES_PASSWORD: my_password
build:
context: .
dockerfile: ./devops/db/Dockerfile.db
我的Dockerfile.db此刻真的很简单:
FROM postgres
MAINTAINER me <me@me.me>
COPY ./devops/db ./devops/db
WORKDIR ./devops/db
我想 运行 某个时候像 psql my_db_name < dump.sql
这样的命令。如果我 运行 来自 Dockerfile.db 的这样的脚本,问题是脚本是 运行 在构建之后但在 docker-compose up
之前,而数据库不是 运行还没有。
知道怎么做吗?
阅读 https://hub.docker.com/_/postgres/,'Extend this image' 部分解释说 /docker-entrypoint-initdb.d 中的任何 .sql 都将在构建后执行。
我只需要将我的 Dockerfile.db 更改为:
FROM postgres
ADD ./devops/db/dummy_dump.sql /docker-entrypoint-initdb.d
而且有效!
sudo docker exec postgres psql -U postgres my_db_name < dump.sql
CONTAINER_NAME="postgres"
DB_USER=postgres
LOCAL_DUMP_PATH="..."
docker run --name "${CONTAINER_NAME}" postgres
docker exec -i "${CONTAINER_NAME}" psql -U "${DB_USER}" < "${LOCAL_DUMP_PATH}"
在 docker-compose up
之后,执行 docker ps
它会给你一个活动的 docker 容器列表。从中,您可以获得容器 ID。
然后,
docker exec -i ${CONTAINER_ID} psql -U ${USER} < ${SQL_FILE}
您可以在容器内使用pg_restore
:
cat ${BACKUP_SQL_File} | docker exec -i ${CONTAINER_NAME} pg_restore \
--verbose \
--clean \
--no-acl \
--no-owner \
-U ${USER} \
-d ${DATABASE}
另一个不需要 Dockerfile 的选项是使用 docker-compose
的 volumes
属性将 sql 文件装载到 docker-entrypoint-initdb.d
文件夹中。
官方 postgres 映像 https://hub.docker.com/_/postgres/ 将导入并执行放置在该文件夹中的所有 SQL 文件。所以像
services:
postgres:
environment:
POSTGRES_DB: my_db_name
POSTGRES_USER: my_name
POSTGRES_PASSWORD: my_password
volumes:
- ./devops/db/dummy_dump.sql:/docker-entrypoint-initdb.d/dummy_dump.sql
这将自动为您填充指定的 POSTGRES_DB
。
我有一个 dump.sql 文件,我想用 docker-compose 加载它。
docker-compose.yml:
services:
postgres:
environment:
POSTGRES_DB: my_db_name
POSTGRES_USER: my_name
POSTGRES_PASSWORD: my_password
build:
context: .
dockerfile: ./devops/db/Dockerfile.db
我的Dockerfile.db此刻真的很简单:
FROM postgres
MAINTAINER me <me@me.me>
COPY ./devops/db ./devops/db
WORKDIR ./devops/db
我想 运行 某个时候像 psql my_db_name < dump.sql
这样的命令。如果我 运行 来自 Dockerfile.db 的这样的脚本,问题是脚本是 运行 在构建之后但在 docker-compose up
之前,而数据库不是 运行还没有。
知道怎么做吗?
阅读 https://hub.docker.com/_/postgres/,'Extend this image' 部分解释说 /docker-entrypoint-initdb.d 中的任何 .sql 都将在构建后执行。
我只需要将我的 Dockerfile.db 更改为:
FROM postgres
ADD ./devops/db/dummy_dump.sql /docker-entrypoint-initdb.d
而且有效!
sudo docker exec postgres psql -U postgres my_db_name < dump.sql
CONTAINER_NAME="postgres"
DB_USER=postgres
LOCAL_DUMP_PATH="..."
docker run --name "${CONTAINER_NAME}" postgres
docker exec -i "${CONTAINER_NAME}" psql -U "${DB_USER}" < "${LOCAL_DUMP_PATH}"
在 docker-compose up
之后,执行 docker ps
它会给你一个活动的 docker 容器列表。从中,您可以获得容器 ID。
然后,
docker exec -i ${CONTAINER_ID} psql -U ${USER} < ${SQL_FILE}
您可以在容器内使用pg_restore
:
cat ${BACKUP_SQL_File} | docker exec -i ${CONTAINER_NAME} pg_restore \
--verbose \
--clean \
--no-acl \
--no-owner \
-U ${USER} \
-d ${DATABASE}
另一个不需要 Dockerfile 的选项是使用 docker-compose
的 volumes
属性将 sql 文件装载到 docker-entrypoint-initdb.d
文件夹中。
官方 postgres 映像 https://hub.docker.com/_/postgres/ 将导入并执行放置在该文件夹中的所有 SQL 文件。所以像
services:
postgres:
environment:
POSTGRES_DB: my_db_name
POSTGRES_USER: my_name
POSTGRES_PASSWORD: my_password
volumes:
- ./devops/db/dummy_dump.sql:/docker-entrypoint-initdb.d/dummy_dump.sql
这将自动为您填充指定的 POSTGRES_DB
。