为了账号安全,请及时绑定邮箱和手机立即绑定

从 docker container 访问 host postgresql

从 docker container 访问 host postgresql

倚天杖 2022-08-17 15:57:51
我有一个弹簧引导Java应用程序在我的linux主机上的docker容器中运行。我在要从正在运行的容器连接到的主机上安装了一个 postgresql 实例。我尝试了多种不同的方法(--network=“host”不是我想要的)。我的 Dockerfile 看起来像这样:FROM openjdk:13-ea-9-jdk-alpine3.9EXPOSE 8080CMD mkdir /opt/StatisticalRestServiceCOPY target/StatisticalRestService-0.0.1-SNAPSHOT.jar         /opt/StatisticalRestService/COPY DockerConfig/application.yml /opt/StatisticalRestService/RUN chmod 777 /opt/StatisticalRestService/StatisticalRestService-0.0.1-SNAPSHOT.jar \&& ls -l /opt/StatisticalRestService/StatisticalRestService-0.0.1-SNAPSHOT.jar \&& INTERNAL_HOST_IP=$(ip route show default | awk '/default/ {print $3}') \&& echo "$INTERNAL_HOST_IP  host.docker.internal" >> /etc/hosts \&& chmod +r /etc/hosts \&& cat /etc/hosts ENTRYPOINT [ "java", "-jar", "-Dspring.config.location=/opt/StatisticalRestService/application.yml", "/opt/StatisticalRestService/StatisticalRestService-0.0.1-SNAPSHOT.jar" ] application.yml:spring:    application:        name: StatisticalRestService    jpa:        database: POSTGRESQL        show-sql: true        hibernate:            ddl-auto: create-drop    datasource:        platform: postgres        #url: jdbc:postgresql://host.docker.internal:5432/StatisticalRestService        url: jdbc:postgresql://172.17.0.1:5432/StatisticalRestService        username: statEntityUser        password: test123        driverClassName: org.postgresql.Driver我已经配置了postresql的设置listen_addressess = '*',以下条目位于pg_hba.conf中:host    all     all     172.17.0.0/16       md5host    all     all     192.168.1.0/24      md5ifconfig docker0:
查看完整描述

1 回答

?
www说

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


我希望有人能得到这个:)


查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 207 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信