【问题标题】:Golang docker library image cannot find go tool in $PATHGolang docker 库镜像在 $PATH 中找不到 go 工具
【发布时间】:2017-06-09 00:17:46
【问题描述】:

我在docker-library/golang#164 上打开了一个问题,因为我认为这是一个错误。但是,我想我也会在 StackOverflow 上询问是否有其他人(除了项目贡献者)遇到过这种情况或有什么想法?

首先,版本号:

$ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true

$ docker-compose version
docker-compose version 1.11.2, build dfed245
docker-py version: 2.1.0
CPython version: 2.7.12
OpenSSL version: OpenSSL 1.0.2j  26 Sep 2016

我收到以下错误:

Cannot start service web: oci runtime error: container_linux.go:247: starting container process caused "exec: \"go\": executable file not found in $PATH"

这是我的Dockerfile

FROM golang:1.8

WORKDIR /go/src/gigem
COPY . /go/src/gigem

RUN go build
RUN go install

CMD ["gigem"]

我也在使用 Compose(我将包含 yml,但无论是否使用 compose,都会出现错误):

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./data:/var/lib/postgresql/data
  web:
    build: .
    volumes:
      - .:/go/src/gigem
    ports:
      - "3000:3000"
    depends_on:
      - db

我的 Go 程序中的所有内容是:

package main

import (
  "fmt"
  "net/http"
)

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello Docker!")
  })

  fmt.Println("Running!")
  fmt.Println(http.ListenAndServe("0.0.0.0:3000", nil))
}

我不太清楚为什么在 $PATH 中找不到 go。

【问题讨论】:

  • 你运行什么命令来得到那个错误?我进行了构建并运行并得到了Running! 输出。
  • 认真的吗?我实际上是在构建和运行可执行文件gigem,这太奇怪了。以前从未在 docker 上经历过这种情况。
  • 尝试另一台机器,仔细检查您的基础映像,清除 /var/lib/docker(所有映像、卷和容器都存储在那里,因此请先备份)和/或重新启动。我见过层的周期性损坏,但幸运的是它很少见。
  • 所以,你是对的。我重新启动了机器,一切正常。这太奇怪了。

标签: docker go docker-compose dockerfile


【解决方案1】:

从 cmets,我自己测试了这段代码没有错误(诚然在 17.06-rc2 上,但行为不应该改变)。鉴于重新启动解决了这个问题,docker 内部似乎出现了一些损坏,需要反弹来纠正(虽然很少见,但这不是我第一次看到这种情况)。对于其他人以后遇到问题,我喜欢依次尝试以下:

  1. 在不缓存任何图层问题的情况下提取新图像和/或重建
  2. 重启 docker 以防止守护进程内部损坏
  3. 重新启动整个主机以解决在 docker 守护程序之外持续存在的运行时配置问题
  4. 停止 dockerd 后,擦除 /var/lib/docker,这将销毁所有容器、映像和卷(因此请先备份)并开始清理

【讨论】:

    【解决方案2】:

    我最近测试了你的 Dockerfile 和 main.go,没有发现任何错误。

    我认为你应该尝试使用docker build --pull . 再次拉动golang: 1.8

    我修改了你的 Dockerfile 添加了两个新行来调试图像,试试:

    FROM golang: 1.8
        
    WORKDIR / go / src / gigem
    COPY. / Go / src / gigem
    
    RUN echo $ PATH
    RUN which go
    RUN go build
    RUN go install
    
    CMD ["gigem"]
    

    Echo $ PATHwhich go 将显示二进制文件go 是否在PATH 中

    【讨论】:

    • 奇怪的是,去$PATH。这使得这更加奇怪。我决定在容器中运行 bash 并尝试手动调用可执行文件。它返回了standard_init_linux.go:178: exec user process caused "exec format error"。所以我认为二进制文件在构建时格式不正确。这可能是卷的错误,它试图为 macOS 架构构建(因为我使用的是 Docker for Mac)?
    • 我重建了映像,进入了一个交互式 bash 会话,运行 go build,然后手动启动它并且它工作。 ://
    • 你是在docker build --pull之后运行的吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多