我正在尝试使用golang
和Docker
我不明白如何从add.go
调用mainmodule
函数。
This post的功能相同,但是它使用github
回购并构建它。
我对golang
和Docker
都是陌生的,所以建议使这个简单的应用程序正常工作都是很好的选择。
这是我的文件夹结构。
- addmodule
- add.go
- Dockerfile
- mainmodule
- main.go
- Dockerfile
- docker-compose.yml
Dockerfile
在addmodule
FROM golang:alpine
RUN apk update
COPY . /go/src
WORKDIR /go/src
RUN go build -o add .
EXPOSE 7070
RUN chmod 755 add
CMD [ "./add" ]
Dockerfile
在mainmodule
FROM golang:alpine
RUN apk update
COPY . /go/src
WORKDIR /go/src
CMD [ "go","run","main.go" ]
docker-compose.yml
version: '3'
services:
addmodule:
image: addmodule
build:
context: ./addmodule
dockerfile: Dockerfile
depends_on:
- mainmodule
mainmodule:
image : mainmodule
build:
context: ./mainmodule
dockerfile: Dockerfile
我的add.go
package main
import (
"log"
"net/http"
)
func add(reswt http.ResponseWriter, req *http.Request) {
log.Println("Request came to here")
}
func main() {
http.HandleFunc("/add", add)
http.ListenAndServe("0.0.0.0:7070", nil)
}
我在main.go
中的mainmodule
package main
import (
"log"
"net/http"
)
func main() {
log.Println("From main package")
res, err := http.Get("0.0.0.0:7070/add")
if err != nil {
log.Println("couldnt send get request")
}
log.Println(res)
}
运行sudo docker-compose up --build
时,我得到couldnt send get request
PS:根据@MaartenDev给出的建议用修改后的代码编辑问题
答案 0 :(得分:2)
Docker compose默认情况下会创建一个网络。服务名称可用于访问同一网络中的容器。
version: '3'
services:
addmodule:
image: addmodule
build:
context: ./addmodule
dockerfile: Dockerfile
depends_on:
- mainmodule
mainmodule:
image : mainmodule
build:
context: ./mainmodule
dockerfile: Dockerfile
mainmodule
可以通过连接到http://addmodule:<port>
到达添加模块,而addmodule
可以通过mainmodule
到达http://mainmodule
这假定这些是http服务。其他任何传输方式都可以使用,因为addmodule
和mainmodule
通过DNS可用。
使用自定义端口时,请确保这些端口在Dockerfile中公开:
FROM golang:alpine
RUN apk update
COPY . /go/src
WORKDIR /go/src
EXPOSE 7070
您的http应该绑定到0.0.0.0,而不是本地主机。这样可以确保可以从容器外部访问该服务:
http.ListenAndServe("0.0.0.0:7070", nil)
主要代码应使用以下内容:
package main
import (
"log"
"net/http"
)
func main() {
log.Println("From main package")
res, err := http.Get("http://addmodule:7070/add") // The mistake I made after a long chat. forgot http://
if err != nil {
log.Println("couldnt send get request")
}
log.Println(res)
}