【问题标题】:Running microservice go (not found)运行微服务 go(未找到)
【发布时间】:2019-05-17 13:40:37
【问题描述】:

我的 Go Module 项目遇到的错误

/bin/sh: 微服务:未找到

Dockerfile

FROM golang:1.7.4-alpine
MAINTAINER John Doe

ENV SOURCES /go/src/github.com/john/app/

COPY . ${SOURCES}

RUN cd ${SOURCES} && cgo_enabled=0 go install

ENV PORT 8080
EXPOSE 8080

ENTRYPOINT microservice

microservice.go

package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", index)
    http.ListenAndServe(port(), nil)
}

func port() string {
    port := os.Getenv("PORT")
    fmt.Println(port)
    if len(port) == 0 {
        port = "8080"
    }
    return ":" + port
}

func index(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Hello World.")
}

这是一个 Go 模块项目。我使用以下命令创建了一个图像。

docker build -t app:1.0.3 .

并通过

运行它
docker run -it -p 8080:8080 app:1.0.3

【问题讨论】:

  • 尝试使用完整路径传递 ENTRYPOINT 文件。还要确保它被正确复制。
  • 你的意思是像这样更新 docker 文件ENTRYPOINT ${SOURCES}microservice
  • 在docker文件中试试echo $PATH, $GOBIN,你可能会发现一些东西
  • @zzn 我是 docker 新手,我添加了 echo,它给了我这个错误。 Error response from daemon: Dockerfile parse error line 13: unknown instruction: ECHO
  • 为什么要投反对票?

标签: docker go microservices


【解决方案1】:

创建的可执行文件位于 /go/bin/app 当前工作目录是/go。

所以,把你的 Dockerfile 的最后一行改成这个

ENTRYPOINT ./bin/app

【讨论】:

  • 谢谢,这行得通。我还有一个问题,如果我所有的源都在根目录中,它可以工作,但是如果我将其中一个文件移动到子目录,比如说api/books.go,我在执行docker build 命令时遇到错误
  • 我认为,问题不是特定于 docker,而是特定于 golang 构建系统。请寻找如何编译 golang 源代码的解决方案。
  • 好的,这也是./bin/app,app这个词是固定的还是因为我的github url来自ENV SOURCES /go/src/github.com/john/app/
  • 更新 Dockerfile 以使用多阶段构建,并将 go-service 可执行文件复制到“scratch”映像是一项值得的投资。您的映像大小基本上会降低 exe 的大小 - 丢失所有现在不需要的构建映像膨胀。
猜你喜欢
  • 2023-02-05
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
相关资源
最近更新 更多