我想使用 Docker 和 docker-compose 部署一個 Web 應用程式。首先,我只關注 PostgreSQL 資料庫和 Spring 后端之間的互動。通過遵循一些教程,我最終得到了以下 docker-compose。
version: "3"
services:
app:
image: 'first-docker-image:latest'
build:
context: ./backend
dockerfile: Dockerfile
container_name: app
depends_on:
- dbpostgresql
ports:
- 8080:8080
dbpostgresql:
image: postgres:12.9
container_name: dbpostgresql
environment:
- POSTGRES_USER=appuser
- POSTGRES_PASSWORD=admin
- POSTGRES_DB=app_db
ports:
- 5432:5432
后端目錄中的 Dockerfile 呼叫 jar 來啟動我的 Spring 后端,并且作業正常。此外,還與資料庫“app_db”建立了連接。
唯一剩下的問題是這個資料庫是空的,所以所有的 API 呼叫都會導致錯誤,因為資料庫中沒有表或資料。但是,我確實有一個 PostgreSQL 轉儲 (app_dump.bak),我想用它來初始化這個資料庫。
為了解決我的問題,我可以運行 docker-compose 并在容器啟動后,像這樣將資料轉儲復制到容器中。
sudo docker cp app_dump.bak <DOCKER_ID>:/app_dump.bak
在此之后,我可以在容器內創建一個外殼并通過執行恢復轉儲
pg_restore --no-owner --no-privileges -d app_db -U appuser app_dump.bak
完成此操作后,一切正常。我可以對后端進行 API 呼叫,并顯示相應的結果。
我正在尋找一種在運行 docker-compose 時執行此程序(初始化資料庫)的方法,因此在容器啟動后不需要額外的步驟。有沒有辦法在 docker-compose 設定中指定這種行為?
我對 Docker 很陌生,所以任何指標都將不勝感激。
uj5u.com熱心網友回復:
你可以指定一個初始化容器來掛載你的檔案并運行命令;
version: "3"
services:
app:
image: "first-docker-image:latest"
build:
context: ./backend
dockerfile: Dockerfile
container_name: app
depends_on:
- dbpostgresql
ports:
- 8080:8080
dbpostgresql:
image: postgres:12.9
container_name: dbpostgresql
environment:
- POSTGRES_USER=appuser
- POSTGRES_PASSWORD=admin
- POSTGRES_DB=app_db
ports:
- 5432:5432
dbpostgresql_init:
image: postgres:12.9
container_name: dbpostgresql_init
command: pg_restore -h dbpostgresql --no-owner --no-privileges -d app_db -U appuser app_dump.bak
volumes:
- ./app_dump.bak:/app_dump.bak
environment:
- POSTGRES_USER=appuser
- POSTGRES_PASSWORD=admin
- POSTGRES_DB=app_db
depends_on:
dbpostgresql:
condition: service_started
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/483959.html
標籤:PostgreSQL 码头工人 码头工人撰写
