standard_init_linux.go:190: exec 用户进程导致“没有这样的文件或目录";带有 Go 基本 Web 应用程序的 Docker [英] standard_init_linux.go:190: exec user process caused "no such file or directory" Docker with go basic web app
问题描述
非常基本的网络应用程序是在 Go 中创建的
The very basic web app is created in Go
package main
import(
"fmt"
"net/http"
"os"
)
func hostHandler(w http.ResponseWriter, r *http.Request){
name, err :=os.Hostname()
if err != nil {
panic(err)
}
fmt.Fprintf(w, "<h1>HOSTNAME: %s</h1><br>",name)
fmt.Fprintf(w, "<h1>ENVIRONMENT VARS: </h1><br>")
fmt.Fprintf(w, "<ul>")
for _, evar := range os.Environ(){
fmt.Fprintf(w, "<li>%s</li>",evar)
}
fmt.Fprintf(w, "</ul>")
}
func rootHandler(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "<h1>Awesome site in Go!</h1><br>")
fmt.Fprintf(w, "<a href='/host/'>Host info</a><br>")
}
func main() {
http.HandleFunc("/", rootHandler)
http.HandleFunc("/host/", hostHandler)
http.ListenAndServe(":8080", nil)
}
Docker 文件
FROM scratch
WORKDIR /home/ubuntu/go
COPY webapp /
EXPOSE 8080
CMD ["/webapp"]
镜像构建成功
ubuntu@ip-172-31-32-125:~/go/src/hello$ docker build -t "webapp" .
Sending build context to Docker daemon 6.152MB
Step 1/5 : FROM scratch
--->
Step 2/5 : WORKDIR /home/ubuntu/go
---> Using cache
---> 8810a06c58c7
Step 3/5 : COPY webapp /
---> Using cache
---> d75222363d3a
Step 4/5 : EXPOSE 8080
---> Using cache
---> 45de0853de8e
Step 5/5 : CMD ["/webapp"]
---> Using cache
---> e9f9031f3632
Successfully built e9f9031f3632
Successfully tagged webapp:latest
但是当我运行 docker 时,它的显示错误.
But when i run the docker its show error.
ubuntu@ip:~/go/src/hello$ docker run webapp
standard_init_linux.go:190: exec user process caused "no such file or directory"
请指导是什么问题,我是 docker 新手,去吧.
Please guide what is the issue, I am new to docker and go.
环境相关信息
ubuntu@ip:~/go/src/hello$ ls
Dockerfile webapp
ubuntu@ip:~/go/src/hello$ echo $GOPATH
/home/ubuntu/go
代码是用go build webapp.go命令编译的
推荐答案
找不到文件可能意味着缺少文件、缺少解释器的脚本或缺少库的可执行文件.在这种情况下,网络导入默认引入 libc,作为动态链接的二进制文件.您应该可以在二进制文件中使用 ldd
看到这一点.
File not found can mean the file is missing, a script missing the interpreter, or an executable missing a library. In this case, the net import brings in libc by default, as a dynamic linked binary. You should be able to see that with ldd
on your binary.
要修复它,您需要传递一些额外的标志:
To fix it, you'll need to pass some extra flags:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags '-w' -o mybin *.go
以上来自:https://medium.com/@diogok/on-golang-static-binaries-cross-compiling-and-plugins-1aed33499671
这篇关于standard_init_linux.go:190: exec 用户进程导致“没有这样的文件或目录";带有 Go 基本 Web 应用程序的 Docker的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!