1 回答

TA貢獻1775條經驗 獲得超8個贊
當我問這個問題時,我沒有按照我想要的方式解決這個問題,但它已經解決了。
我最終也創建了一個帶有卷的postgres容器,以保持持久化數據的持久性。
我為postgres制作了一個Dockerfile,看起來像這樣:
FROM postgres:10-alpine
RUN mkdir /docker-entrypoint-initdb.d/
#COPY initdb.sql /docker-entrypoint-initdb.d/
COPY my-postgres.conf /usr/local/share/postgresql/postgresql.conf
#ENV POSTGRES_USER statEntityUser
#ENV POSTGRES_PASSWORD test123
#ENV POSTGRES_DB StatisticalRestService
ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 5432
CMD [ "postgres" ]
initdb.sql腳本只是創建與注釋環境變量相同的內容,即用戶,密碼和數據庫。放置在該文件夾中的 Sql 腳本在數據庫啟動并準備就緒時由入口點腳本運行(這是我派生的 Docker 映像中的一個開箱即用功能)。它們被注釋掉的原因是它位于 docker-compose 文件中(見下文)。postgresql.conf 基本上是包含在容器中的模板,但listen_addresses = '*' 未注釋。
我還制作了一個 docker-compose.yml 來以一種很好的方式同時運行這兩個容器:
version: "3"
services:
statistical-rest-service:
build: ./StatisticalRestService
ports:
- 8081:8080
depends_on:
- postgres
networks:
- statisticsNet
postgres:
container_name: postgres
build: ./Postgres
ports:
- 5433:5432
volumes:
- postgres-volume:/var/lib/postgresql/data
command: postgres -c 'config_file=/usr/local/share/postgresql/postgresql.conf'
networks:
- statisticsNet
environment:
POSTGRES_USER: statEntityUser
POSTGRES_PASSWORD: test123
POSTGRES_DB: StatisticalRestService
networks:
statisticsNet:
volumes:
postgres-volume:
我不確定你是否必須事先創建該卷,或者它是否包含在docker-compose中,但如果需要,它只是.docker volume create postgres-volume
有關如何使用映像和/或從中派生的 Postgres 文檔:Docker 集線器上的 Postgres 注意:當您使用指定的卷啟動容器時,請犯一些錯誤并將其關閉,當您再次啟動它時,它不會弄亂卷上的現有數據庫。您可能會遇到這樣的情況:您有“懸空卷”,這些卷是您已殺死并刪除的舊運行時容器的過時版本,但它們可能會產生意外的行為(對我來說,用戶和數據庫不是因此而創建的)。您可以使用以下命令清除它們:(或運行 $() 中的命令以列出最終懸空的卷。docker volume rm $(docker volume ls -qf dangling=true)
由于我正在 docker-compose 文件中創建一個專用的 docker 網絡,因此容器可以按名稱找到彼此(注意 container_name)。這使得我的java的apprament.yml中的連接網址如下所示:url: jdbc:postgresql://postgres:5432/StatisticalRestService
我希望有人能得到這個:)
添加回答
舉報