我已经读了很多关于不同语言的类似的问题,没有一个是去的。
我刚刚创建了一个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: unknown中找到。
我记得我在中的GOPATH
环境变量遇到了一些问题,可能是因为.有什么建议吗?
发布于 2021-11-30 07:41:36
正式的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 run --rm -it users-service
Hello, World!
发布于 2021-11-30 07:14:35
您的"app“可执行二进制文件应该可以在您的$PATH
中使用,以便在没有任何路径前缀的情况下全局调用。否则,您必须向可执行文件(如CMD ["/my/app"]
)提供完整的路径。
此外,我建议使用ENTRYPOINT
指令。ENTRYPOINT
表示可执行文件的直接路径,而CMD
表示提供给ENTRYPOINT
的参数。
使用组合的RUN
指令使您的图像层最小化,与使用多个RUN
相比,您的整体图像大小会变得稍微小一些。
https://stackoverflow.com/questions/70171108
复制相似问题