代码之家  ›  专栏  ›  技术社区  ›  Ajay yadav

standard_init_linux.go:190:exec用户进程导致go basic web app的Docker“没有这样的文件或目录”

  •  2
  • Ajay yadav  · 技术社区  · 8 年前

    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时,它显示错误。

    ubuntu@ip:~/go/src/hello$ docker run webapp
    standard_init_linux.go:190: exec user process caused "no such file or directory"
    

    请引导是什么问题,我是新来码头和去。

    环境相关信息

    ubuntu@ip:~/go/src/hello$ ls
    Dockerfile  webapp
    ubuntu@ip:~/go/src/hello$ echo $GOPATH
    /home/ubuntu/go
    

    转到生成webapp.go

    4 回复  |  直到 6 年前
        1
  •  12
  •   BMitch    8 年前

    找不到文件可能意味着文件丢失、脚本缺少解释器或可执行文件缺少库。在本例中,净导入默认引入libc,作为动态链接二进制文件。你应该能看到的 ldd 在你的二进制文件上。

    要修复它,您需要传递一些额外的标志:

    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

        2
  •  5
  •   Ivan    7 年前

    对我来说 CGO_ENABLED=0 是解决这个问题的关键。

    Cgo公司 允许在Go源代码中使用内联C代码,请参阅更多: https://golang.org/cmd/cgo/

    我估计默认情况下Cgo会将应用程序动态链接到 伦敦银行 ,即使不使用任何内联C。
    FROM scratch

    这是我的工作 Dockerfile文件

    FROM golang:1.9.2-alpine AS builder
    WORKDIR /go/src/app
    COPY . .
    RUN CGO_ENABLED=0 go install
    
    
    FROM scratch
    WORKDIR /opt
    COPY --from=builder /go/bin/app .
    ENTRYPOINT ["/opt/app"]
    
        3
  •  1
  •   user15041257    5 年前

    内部版本:

    # build
    CGO_ENABLED=0 go build -o myapp main.go
    

    dockerfile文件:

    #FROM alpine:3.10
    FROM scratch
    COPY . /
    
    EXPOSE 8080
    
    CMD ["/myapp", "-c", "app.ini"]
    
        4
  •  0
  •   Meiram Chuzhenbayev    8 年前

    尝试更改Dockerfile中的行

    COPY webapp /webapp

        5
  •  0
  •   Madhur Bhaiya    8 年前

    env GOARCH=386 GOOS=linux go build webapp.go
    
        6
  •  0
  •   Jose Del Rio    6 年前

    就我而言,en env还不够:

    我还必须在构建中添加标记和ldflags: