【问题标题】:Docker Go image: starting container process caused: exec: "app": executable file not found in $PATH: unknownDocker Go 映像:启动容器进程导致:exec:“app”:$PATH 中找不到可执行文件:未知
【发布时间】:2022-01-07 06:30:59
【问题描述】:

我已经阅读了很多关于不同语言的类似问题,它们都不是 Go。

我刚刚使用official Docker hub page 上的说明创建了一个 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!")
}
  1. 我跑了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
  1. 然后我跑了docker run users-service,但我得到了那个错误:

$ docker run 用户服务

docker:来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380:启动容器进程导致:exec:“app”:$PATH 中找不到可执行文件:未知。

我记得我在 Windows 上的 Visual Studio Code 中使用 GOPATH 环境变量时遇到了一些问题,可能与此有关...有什么建议吗?

【问题讨论】:

  • 可以分享一下app相关的代码吗?
  • 同时添加构建命令的输出,即使看起来没问题。
  • @JinnaBalu 完成。
  • @jabbson 添加。
  • 你可以使用 ./app 作为 CMD。

标签: docker go environment-variables


【解决方案1】:

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!

【讨论】:

  • 是的,确实有效。谢谢。
【解决方案2】:

你的“app”可执行二进制文件应该在你的$PATH 中可用,可以在没有任何路径前缀的情况下全局调用。否则,您必须提供可执行文件的完整路径,例如 CMD ["/my/app"]

另外,我建议使用ENTRYPOINT 指令。 ENTRYPOINT 表示可执行文件的直接路径,而CMD 表示提供给ENTRYPOINT 的参数。

与使用多个RUNs 相比,使用组合RUN 指令可以使您的图像层最小化,您的整体图像大小会变得更小。

【讨论】:

  • (我通常建议使用CMD 而不是ENTRYPOINT;例如,docker run --rm -it users-service /bin/sh 可以更容易地在图像上获取交互式调试外壳以查找二进制文件的实际位置,并且使用ENTRYPOINT 进行首次设置,然后将CMD 作为主容器命令启动。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 2022-11-10
  • 2020-01-15
  • 1970-01-01
相关资源
最近更新 更多