我创建了一个包含 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 requests
func 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 image
FROM golang:latest
WORKDIR /go/src/server
COPY ./src/server .
# Download packages
RUN go get .
# Compile code
#RUN go build -o server
RUN go install server
# Expose ports
EXPOSE 8500
EXPOSE 8600
#ENTRYPOINT ./server
CMD ["go", "run", "server"]
凤凰求蛊
相关分类