【问题标题】:bash: No such file or directory when running a dockerfilebash:运行dockerfile时没有这样的文件或目录
【发布时间】:2022-08-19 00:53:43
【问题描述】:

我正在尝试从dockerfile 和docker-compose 文件运行一个容器,看起来像这样 -

docker-compose.yml

build:
      context: .
      dockerfile: docker/Dockerfile
      target: go-container
    entrypoint: bash -c \"./main\"

Dockerfile 看起来像这样 -

ARG GO_VERSION=1.17
FROM golang:$GO_VERSION as go-container
ENV GOPATH /gopath
ENV PATH $GOPATH/bin:$PATH
WORKDIR /gopath/src/project

ADD go.mod go.sum ./
RUN go mod download -x
RUN go build -o main cmd/main.go


FROM scratch as another_container
COPY --from=go-container /gopath/src/project/main .
ENTRYPOINT [\"./main\"]

在运行docker-compose 时,我收到这样的错误 -

bash: line 1: ./main: No such file or directory
ERROR: 127

这里发生了什么?我不知道如何调试它,所以任何帮助表示赞赏!

  • bash -c \"./main\"?为什么要有bash -c(它要求你的容器中有bash)而不是让main自己成为你的入口点?

标签: docker go docker-compose dockerfile


【解决方案1】:
FROM scratch as another_container

您正在使用 FROM 语句,它将当前容器替换为基于图像的新容器。在这种情况下,您正在执行它FROM scratch,它是一个没有任何内容的容器。

由于您没有使用COPY --from 复制上一阶段的编译文件,因此缺少文件./main,因此您的应用程序将无法运行。

有关多阶段 Go 构建示例,请参阅 here。

【讨论】:

  • 您能在帖子中查看我更新的 dockerfile 命令吗?我实际上已经使用了Copy --from 命令
  • COPY --from 必须在 FROM 之后。请参阅我链接的示例。
【解决方案2】:

Docker scratch 没有bash 之类的二进制文件,基本上它是一个空上下文。 FROM scratch as another_container 指令然后删除以前的层;在这种情况下,./main 文件被排除在外。

您可以使用另一个最小图像,即FROM busybox as another_container,来执行./main 二进制文件。

IE:

ARG GO_VERSION=1.17
FROM golang:$GO_VERSION as go-container
ADD go.mod go.sum ./
RUN go mod download -x
RUN go build -o main cmd/main.go
FROM busybox as another_container
COPY --from=go-container ./main /main
ENTRYPOINT ["./main"]

完整示例:

docker-compose.yaml

version: "3.9"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
      target: go-container
    entrypoint: bash -c "./main"

Dockerfile

ARG GO_VERSION=1.17
FROM golang:$GO_VERSION as go-container
ENV GOPATH /gopath
ENV PATH $GOPATH/bin:$PATH
WORKDIR /gopath/src/project

ADD go.mod go.sum main.go ./
RUN go mod download -x
RUN go build -o main main.go

FROM busybox as another_container
COPY --from=go-container /gopath/src/project/main .

ENTRYPOINT ["./main"]

main.go

package main

import "fmt"

func main() {
    fmt.Println("Created with vim-go")
}

执行:docker compose up

docker compose up
[+] Running 2/2
 ⠿ Network delete_default  Created                                                                                                                                                                                                       0.0s
 ⠿ Container delete-web-1  Created                                                                                                                                                                                                       0.0s
Attaching to delete-web-1
delete-web-1  | vim-go
delete-web-1 exited with code 0

【讨论】:

  • 您能在帖子中查看我更新的 dockerfile 命令吗?我实际上已经使用了 Copy --from 命令
  • 我用完整的例子更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多