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
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
J'ai utilisé ça et ça marche
env GOARCH=386 GOOS=linux go build webapp.go
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"]
Essayez de changer de ligne dans votre fichier Dockerfile
COPY webapp /webapp