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

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

訪問托管在 Docker 容器中的 Go Api

訪問托管在 Docker 容器中的 Go Api

Go
瀟瀟雨雨 2022-06-01 16:08:29
我創建了一個包含 api 的 Go 后端服務器。在本地運行“運行服務器”時一切正常。然而,我在 docker 中運行它時確實遇到了問題。所以我創建了一個 Dockerfile 并在 networkmode 主機中運行 linux 容器,但無法在瀏覽器中訪問 api。如果它工作正常,我應該能夠看到來自http://localhost:8500/status的 json 響應。所以我想我需要權限或添加標志或更多與安裝相關的腳本。我一直在 docker 中測試不同的標志和端口,但無法識別問題。請參閱下面的代碼、dockerfile 和命令。注意:當我在 Windows 上本地運行程序時,會彈出一個安全警告,也許這與問題有關?我正在運行 docker desktop community v 2.2.0.5 stable。接口代碼:import (    "log"    "net/http"    conf "server/conf"    "github.com/gorilla/mux"    "github.com/jinzhu/gorm"    _ "github.com/jinzhu/gorm/dialects/mysql")var db *gorm.DB// Middleware used to add correct permissions for all requestsfunc middleware(next http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        w.Header().Set("Access-Control-Allow-Origin", "*")        w.Header().Set("Access-Control-Allow-Headers", "Content-Type")        next.ServeHTTP(w, r)    })}func StartApi(config conf.Config, _db *gorm.DB) {log.Println("Start Api")    db = _db    router := mux.NewRouter()    // Create     router.HandleFunc("/login", login).Methods("POST", "OPTIONS")    router.HandleFunc("/network", createNetwork).Methods("POST", "OPTIONS")    // Read     router.HandleFunc("/users/{networkName}", getUsers).Methods("GET", "OPTIONS")    router.HandleFunc("/streams/{networkName}", getStreams).Methods("GET", "OPTIONS")    router.HandleFunc("/status", showStatus).Methods("GET", "OPTIONS")    log.Println("API started at port " + config.Backend.Api_port) // api port is stored in config    log.Println(http.ListenAndServe(":"+config.Backend.Api_port, middleware(router)))    log.Println("Api done!")  }Dockerfile:# Start from the latest golang base imageFROM golang:latestWORKDIR /go/src/serverCOPY ./src/server .# Download packagesRUN go get . # Compile code#RUN go build -o serverRUN go install server# Expose portsEXPOSE 8500EXPOSE 8600#ENTRYPOINT ./serverCMD ["go", "run", "server"]
查看完整描述

1 回答

?
鳳凰求蠱

TA貢獻1825條經驗 獲得超4個贊

所以我現在通過以下方式解決了它:

如此處所述: https ://docs.docker.com/compose/networking/

添加到 docker-compose:

networks:
  default:
    external:
      name: database_default

我可以在后端以 < db_container_name >:3306 的形式連接到數據庫。


為了自動化這個過程,我創建了一個 .sh 腳本來處理容器啟動時的額外設置配置步驟。但是,由于我在 config.yml 中的結構,僅使用“sed”命令很難更新,因此我創建了一個 python 程序來更新所有配置數據。Dockerfile、docker-compose 文件、setup.sh 和 update_config.py 文件如下所示。


設置.sh:


#!/bin/bash

# Don't remove this!

# This file is used by dockerfile to replace configs


# Replace config on run

python3 update_config.py


# Start program

go run server

Dockerfile:


# Start from the latest golang base image

FROM golang:latest


WORKDIR /go/src/server


COPY ./src/server .


# Install python3 and yml compability

RUN apt-get update && apt-get install -y python3-pip

RUN python3 --version

RUN pip3 install PyYAML


# Download packages

RUN go get . 


# Compile code

#RUN go build -o server

RUN go install server


# Expose ports

EXPOSE 8500

EXPOSE 8600


# ENV

 ENV DB_HOST "mysql:3306"


#CHMOD setup

RUN chmod +x setup.sh


CMD ["./setup.sh"]

碼頭工人組成


version : '3'


services:

  react:

    build: ./ReactFrontend/

    container_name: ReactFrontend

    tty: true

    ports:

    - 4000:3000


  backend:

    build: ./GoBackend/

    container_name: GoBackend

    environment:

      DB_HOST: mysql:3306 # Name or IP of DB container!

    ports:

    - 8500:8500

    - 8600:8600


networks:

  default:

    external:

      name: database_default

更新配置.py:


import yaml

import os


"""

DONT REMOVE

This file is used in the dockerfile!

"""


fname = "/go/src/server/config.yml"


stream = open(fname, 'r')

data = yaml.safe_load(stream)

stream.close()


# Add more updates here!

if os.environ.get('DB_HOST') is not None:

    data["database"]["ip"] = os.environ['DB_HOST']



# Updated data print

print("Updated Data", data)


# Write changes to config

stream = open(fname, 'w')

yaml.dump(data, stream)

stream.close()

如果我們只希望容器運行,現在可以使用的示例 docker 命令:


docker run -p 8500:8500 -p 8600:8600 --net database_default goserver

它工作正常!我們正在避免使用不必要的主機網絡模式!


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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