Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pakej Dockerfile untuk pergi

Pakej Dockerfile untuk pergi

WBOY
WBOYke hadapan
2024-02-05 23:36:08429semak imbas

Dockerfile 包去

Kandungan soalan

Saya ada tulis permohonan dalam go dan gin Fail dibahagikan seperti berikut:

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

Dalam setiap folder saya mempunyai pakej yang memanggil pakej lain, contohnya:

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"
)

Go.mod saya adalah seperti ini:

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
)

Jadi ia mengikut aliran permohonan saya..

Saya ingin membuat imej docker aplikasi ini (untuk tujuan pembelajaran, saya ingin belajar asas docker, jadi saya buat api ini untuk ujian)

imej buruh pelabuhan:

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"]

Ralat semasa cuba membina imej:

=> 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

Ada sesiapa tahu kenapa? Saya benar-benar tidak tahu bagaimana untuk menyelesaikan masalah ini, bagaimana saya boleh mengimport pakej saya ke dalam imej docker?

--Edit

Saya mengemas kini fail docker saya seperti yang dicadangkan:

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"]

Ralat:

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 


Jawapan betul


Soalan berlaku pada copy main.go ./ ini.

Bagaimana golang akan melihat kebergantungan/pakej?

  • Cache Modul: Semak sama ada pakej wujud dalam modcache $gopath/pkg/mod
  • Direktori Projek: Jika pakej tidak ditemui dalam modcache, maka ia akan menyemak sama ada pakej itu wujud berbanding akar modul projek kami. (github.com/guilherm5/login-user/models - Semak sama ada direktori bernama models wujud.)
  • Jauh: Jika pakej tidak ditemui dalam cache modul atau akar projek, dapatkannya dari repositori jauh.

Dalam kes anda, anda sudah mempunyai pakej (direktori) dalam akar modul projek anda, tetapi hanya main.go disalin ke sistem kontena. Jadi apabila go mod tidy dijalankan, ia tidak dapat melihat pakej dalam cache atau direktori root. Kemudian ia cuba menariknya dari alat kawalan jauh.

Saya mempunyai kod dalam repo jauh, jadi mengapa ia tidak menarik ? Kerana repositori adalah peribadi.

Penyelesaian

Salin semua fail dan folder ke sistem kontena

copy . .

Masalah akan selesai. Anda sudah mempunyai binaan berbilang peringkat dengan hanya fail yang diperlukan dalam binaan pengeluaran akhir.

Lihat

Atas ialah kandungan terperinci Pakej Dockerfile untuk pergi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam