亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 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 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號