Heim  >  Artikel  >  Backend-Entwicklung  >  Dockerfile-Paket zum Mitnehmen

Dockerfile-Paket zum Mitnehmen

WBOY
WBOYnach vorne
2024-02-05 23:36:08378Durchsuche

Dockerfile 包去

Frageinhalt

Ich habe eine Bewerbung in Go und Gin geschrieben. Die Datei ist wie folgt aufgeteilt:

main.go 
    controller 
        controllers.go 
    database    
        database.go 
    middleware 
        middleware.go 
    models 
        models.go 
    routes 
        routes.go 
go.mod 
go.sum 
dockerfile

In jedem Ordner habe ich ein Paket, das ein anderes Paket aufruft, zum Beispiel:

package controller

import (
    "log"
    "net/http"
    "os"

    gomail "gopkg.in/mail.v2"

    "github.com/dgrijalva/jwt-go"
    "github.com/gin-gonic/gin"
    models "github.com/guilherm5/login-user/models"
)

package routes

import (
    "github.com/gin-gonic/gin"
    controller "github.com/guilherm5/login-user/controller"
    middleware "github.com/guilherm5/login-user/middleware"
)

Mein go.mod sieht so aus:

module github.com/guilherm5/login-user



go 1.20

require (
    github.com/dgrijalva/jwt-go v3.2.0+incompatible
    github.com/gin-gonic/gin v1.9.0
    github.com/golang-jwt/jwt v3.2.2+incompatible
    github.com/joho/godotenv v1.5.1
    github.com/lib/pq v1.10.9
    golang.org/x/crypto v0.9.0
    gopkg.in/mail.v2 v2.3.1
)

require (
    github.com/bytedance/sonic v1.8.0 // indirect
    github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
    github.com/gin-contrib/sse v0.1.0 // indirect
    github.com/go-playground/locales v0.14.1 // indirect
    github.com/go-playground/universal-translator v0.18.1 // indirect
    github.com/go-playground/validator/v10 v10.11.2 // indirect
    github.com/goccy/go-json v0.10.0 // indirect
    github.com/json-iterator/go v1.1.12 // indirect
    github.com/klauspost/cpuid/v2 v2.0.9 // indirect
    github.com/leodido/go-urn v1.2.1 // indirect
    github.com/mattn/go-isatty v0.0.17 // indirect
    github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
    github.com/modern-go/reflect2 v1.0.2 // indirect
    github.com/pelletier/go-toml/v2 v2.0.6 // indirect
    github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
    github.com/ugorji/go/codec v1.2.9 // indirect
    golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
    golang.org/x/net v0.10.0 // indirect
    golang.org/x/sys v0.8.0 // indirect
    golang.org/x/text v0.9.0 // indirect
    google.golang.org/protobuf v1.28.1 // indirect
    gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
    gopkg.in/yaml.v3 v3.0.1 // indirect
)

Es folgt also meinem Bewerbungsablauf..

Ich möchte ein Docker-Image dieser Anwendung erstellen (zu Lernzwecken möchte ich die Grundlagen von Docker erlernen, deshalb habe ich diese API zum Testen erstellt)

Docker-Bild:

from golang:1.20 as build 

workdir /mail 

copy go.sum ./
copy go.mod ./
copy main.go ./


run go mod download
run go build -o /appmail

from gcr.io/distroless/base-debian10

workdir /

copy --from=build /mail /mail

expose 4000/

user nonroot:nonroot 

entrypoint ["/appmail"]

Fehler beim Versuch, das Image zu erstellen:

=> error [build 7/7] run go build -o /appmail             0.7s 
------
 > [build 7/7] run go build -o /appmail:
#13 0.680 main.go:5:2: no required module provides package github.com/guilherm5/login-user/routes; to add it:
#13 0.680       go get github.com/guilherm5/login-user/routes   
------
executor failed running [/bin/sh -c go build -o /appmail]: exit code: 1

Weiß jemand warum? Ich weiß wirklich nicht, wie ich dieses Problem lösen soll. Wie kann ich mein Paket in das Docker-Image importieren?

--Bearbeiten

Ich habe meine Docker-Datei wie vorgeschlagen aktualisiert:

from golang:1.20 as build 

workdir /mail 

copy go.sum ./
copy go.mod ./
copy main.go ./

run go mod tidy
run go mod download
run go build -o /appmail

from gcr.io/distroless/base-debian10

workdir /

copy --from=build /mail /mail

expose 4000/

user nonroot:nonroot 

entrypoint ["/appmail"]

Fehler:

github.com/guilherm5/login-user imports
#12 9.121       github.com/guilherm5/login-user/routes: cannot find module providing package github.com/guilherm5/login-user/routes: module github.com/guilherm5/login-user/routes: git ls-remote -q origin in /go/pkg/mod/cache/vcs/a7be81f5c5695c6941aa1b7f5a49aa0800b2d648c4d72609eb5feae6f51cf505: exit status 128:
#12 9.121       fatal: could not read Username for 'https://github.com': terminal prompts disabled
#12 9.121 Confirm the import path was entered correctly.        
#12 9.121 If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
------
executor failed running [/bin/sh -c go mod tidy]: exit code: 1 


Richtige Antwort


Die Frage ist copy main.go ./diesem passiert.

Wie wird Golang Abhängigkeiten/Pakete anzeigen?

  • Modul-Cache: Überprüfen Sie, ob das Paket im Modcache $gopath/pkg/mod
  • vorhanden ist
  • Projektverzeichnis: Wenn das Paket nicht im Modcache gefunden wird, wird geprüft, ob das Paket relativ zu unserem Projektmodul-Stammverzeichnis existiert. (github.com/guilherm5/login-user/models – Überprüfen Sie, ob ein Verzeichnis mit dem Namen models existiert.)
  • Remote: Wenn das Paket nicht im Modulcache oder Projektstammverzeichnis gefunden wird, holen Sie es aus dem Remote-Repository.

In Ihrem Fall haben Sie das Paket (Verzeichnis) bereits im Stammverzeichnis Ihres Projektmoduls, aber nur main.go wird in das Containersystem kopiert. Wenn go mod tidy ausgeführt wird, kann das Paket also nicht im Cache oder Stammverzeichnis angezeigt werden. Dann versucht es, es von der Fernbedienung abzurufen.

Ich habe den Code im Remote-Repo, warum zieht er also nicht ? Weil das Repository privat ist.

Lösung

Alle Dateien und Ordner in das Containersystem kopieren

copy . .

Das Problem wird gelöst. Sie verfügen bereits über einen mehrstufigen Build mit nur den erforderlichen Dateien im endgültigen Produktions-Build.

Ansicht

Das obige ist der detaillierte Inhalt vonDockerfile-Paket zum Mitnehmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen