从 docker container 访问 host postgresql

我有一个弹簧引导Java应用程序在我的linux主机上的docker容器中运行。我在要从正在运行的容器连接到的主机上安装了一个 postgresql 实例。


我尝试了多种不同的方法(--network=“host”不是我想要的)。


我的 Dockerfile 看起来像这样:


FROM openjdk:13-ea-9-jdk-alpine3.9

EXPOSE 8080

CMD mkdir /opt/StatisticalRestService

COPY 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       md5

host    all     all     192.168.1.0/24      md5

ifconfig docker0:

倚天杖
浏览 208回答 1
1回答

www说

当我问这个问题时,我没有按照我想要的方式解决这个问题,但它已经解决了。我最终也创建了一个带有卷的postgres容器,以保持持久化数据的持久性。我为postgres制作了一个Dockerfile,看起来像这样:FROM postgres:10-alpineRUN 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 StatisticalRestServiceENTRYPOINT ["docker-entrypoint.sh"]EXPOSE 5432CMD [ "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: StatisticalRestServicenetworks:  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我希望有人能得到这个:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java