我一直在閱讀很多關于不同語言的類似問題,但沒有一個是 Go。
我剛剛按照我在官方 Docker 中心頁面上的說明創建了一個 Dockerfile :
FROM golang:1.17.3
WORKDIR /go/src/app
COPY . .
RUN go get -d -v ./...
RUN go install -v ./...
CMD ["app"]
這是我的檔案夾結構:
users-service
|-> .gitignore
|-> Dockerfile
|-> go.mod
|-> main.go
|-> README.md
如果有人需要查看一些代碼,這就是我的main.go樣子:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
- 我跑了
docker build -t users-service .:
$ docker build -t users-service .
[ ] Building 5.5s (11/11) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 154B 0.1s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/golang:1.17.3 3.3s
=> [auth] library/golang:pull token for registry-1.docker.io 0.0s
=> [1/5] FROM docker.io/library/golang:1.17.3@sha256:6556ce40115451e40d6afbc12658567906c9250b0fda250302dffbee9d529987 0.3s
=> [internal] load build context 0.1s
=> => transferring context: 2.05kB 0.0s
=> [2/5] WORKDIR /go/src/app 0.1s
=> [3/5] COPY . . 0.1s
=> [4/5] RUN go get -d -v ./... 0.6s
=> [5/5] RUN go install -v ./... 0.7s
=> exporting to image 0.2s
=> => exporting layers 0.1s
=> => writing image sha256:1f0e97ed123b079f80eb259dh3e34c90a48bf93e8f55629d05044fec8bfcaca6 0.0s
=> => naming to docker.io/library/users-service 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
- 然后我跑了,
docker run users-service但我得到了那個錯誤:
$ docker 運行用戶服務
docker:來自守護行程的錯誤回應:OCI 運行時創建失敗:container_linux.go:380:導致啟動容器行程:exec:“app”:在 $PATH 中找不到可執行檔案:未知。
我記得我GOPATH在 Windows 上的 Visual Studio Code 中遇到了環境變數的一些問題,也許它是相關的......有什么建議嗎?
uj5u.com熱心網友回復:
Docker 官方檔案提供了構建 Go 鏡像的有用說明:https : //docs.docker.com/language/golang/build-images/
總之,您需要構建 Go 二進制檔案,并且需要適當地配置 CMD,例如:
FROM golang:1.17.3
WORKDIR /app
COPY main.go .
COPY go.mod ./
RUN go build -o /my-go-app
CMD ["/my-go-app"]
構建容器:
$ docker build -t users-service .
運行 docker 容器:
$ docker run --rm -it users-service
Hello, World!
uj5u.com熱心網友回復:
您的“應用程式”可執行二進制檔案應該可以在$PATH沒有任何路徑前綴的情況下全域呼叫。否則,您必須提供可執行檔案的完整路徑,例如CMD ["/my/app"]
另外,我建議使用ENTRYPOINT指令。ENTRYPOINT表示可執行檔案的直接路徑,而CMD表示提供給ENTRYPOINT.
使用組合RUN指令使您的影像層最小化,與使用多個RUNs相比,您的整體影像大小會變小一點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/371081.html
上一篇:從/在VSCODE中洗掉無效字符
下一篇:natsClient.Subscribe("some_subject",some_callback):'some_callback'回呼是否在Golang自己的
