web-dev-qa-db-fra.com

standard_init_linux.go: 190: Le processus utilisateur exec a provoqué "aucun fichier ou répertoire de ce type" Docker avec l'application Web de base Go

L'application Web très basique est créée dans 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)


}

Fichier Docker pour cela

FROM scratch
WORKDIR /home/ubuntu/go
COPY webapp /
EXPOSE 8080
CMD ["/webapp"]

L'image est construite avec succès 

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

Mais quand je lance le menu fixe son show error.

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

S'il vous plaît guider ce qui est le problème, je suis nouveau à docker et aller.

Informations relatives à l'environnement

ubuntu@ip-172-31-32-125:~/go/src/hello$ ls
Dockerfile  webapp
ubuntu@ip-172-31-32-125:~/go/src/hello$ echo $GOPATH
/home/ubuntu/go

Le code a été compilé avec go build webapp.go command

2
Ajay yadav

Fichier non trouvé peut signifier que le fichier est manquant, qu'un script manque de l'interpréteur ou qu'un exécutable manque d'une bibliothèque. Dans ce cas, l'importation nette introduit libc par défaut, sous la forme d'un binaire lié dynamique. Vous devriez pouvoir voir cela avec ldd sur votre binaire.

Pour résoudre ce problème, vous devrez passer des indicateurs supplémentaires:

CGO_ENABLED=0 GOOS=linux GOARCH=AMD64 go build -a -tags netgo -ldflags '-w' -o mybin *.go

Ce qui précède provient de: https://medium.com/@diogok/on-golang-static-binaries-cross-compiling-and-plugins-1aed33499671

5
BMitch

J'ai utilisé ça et ça marche

env GOARCH=386 GOOS=linux go build webapp.go
0
andres833

Dans mon cas, CGO_ENABLED=0 était la clé pour résoudre ce problème.

Cgo permet d'utiliser du code C en ligne dans les sources Go, voir plus: https://golang.org/cmd/cgo/

Je pense que par défaut Cgo lie dynamiquement votre application à libc , même si vous n’utilisez pas de C en ligne.
Et la bibliothèque est manquante lorsque vous empaquetez votre application dans l'image Docker FROM scratch

Voici mon travail 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"]
0
Ivan

Essayez de changer de ligne dans votre fichier Dockerfile

COPY webapp /webapp

0