我正在尝试从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
这里发生了什么?我不知道如何调试它,所以任何帮助都很感激!
FROM scratch as another_container
您使用的是FROM语句,它将当前容器替换为基于图像的新容器。在这种情况下,您正在执行FROM scratch
,这是一个没有任何内容的容器
由于您没有使用COPY --from
来复制前一阶段编译的文件,因此缺少文件./main
,因此您的应用程序无法工作。
有关多级Go构建示例,请参见此处。
Dockerscratch
没有像bash
这样的二进制文件,基本上它是一个空上下文。CCD_ 11指令然后移除先前的层;在这种情况下,CCD_ 12文件被排除在外。
您可以使用另一个最小映像,即FROM busybox as another_container
来执行./main
二进制文件。
即:
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