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
我希望有人能得到这个:)
添加回答
举报