为Golang Web应用程序创建dockerfile

tv6aics1  于 2023-04-11  发布在  Docker
关注(0)|答案(2)|浏览(98)

我试着按照教程中的方法去做,但由于某些原因,由于我的目录是如何设置的,我似乎无法创建一个dockerfile来为我的web应用创建一个docker容器,这样我就可以使用docker在多个设备上运行它。
以下是我的项目结构:

MyApp
    /cmd
        /web
            - main.go
            - middleware.go
            - routes.go
    /pkg
        /somepackage
            - somegolangfile.go 
        /anotherpackageIuse
            - somegolangfile.go
    /templates
        -HTML files 
    go.mod
    go.sum
    .gitignore 
    Dockerfile

下面是我使用的dockerfile:

FROM golang:latest as build

WORKDIR /build
COPY . .
RUN go build  -o app .
 
FROM alpine:latest as run
WORKDIR /app
COPY --from=build /build/app .
ENTRYPOINT ["/app/app"]

我得到的错误是/build中没有go文件。这是正确的,错误是有意义的,因为go文件在cmd/web/中。
但是,我似乎不能解决它。我试过这样做:

FROM golang:latest as build

WORKDIR /build
COPY . .
RUN go build  cmd/web/ -o app .
 
FROM alpine:latest as run
WORKDIR /app
COPY --from=build /build/app .
ENTRYPOINT ["/app/app"]

这里的主要区别是,我用RUN go build cmd/web/ -o app .交换了RUN go build -o app .,但是我得到的错误是我的sum.go和mod.go不在目录中,这也是真的
我如何为我的web应用创建一个docker容器,并将其构建为我的go文件在不同的目录中?另外,当我正常运行我的web应用时,我使用了go run cmd/web/*.go,其中cmd/web目录中的所有golang文件需要同时运行。因此,我还需要我的dockerfile来构建和编译所有golang文件

3qpi33ja

3qpi33ja1#

你的build命令中多了一个点,参数顺序错误:

RUN go build -o app ./cmd/web/...
oalqel3c

oalqel3c2#

嘿@Radin Khosraviani,
copy . .只会复制源代码。您还需要复制Go module files
下面我修改了你的docker文件,并添加了COPY go.mod .COPY go.sum .RUN go mod download

FROM golang:latest as build

WORKDIR /app

# Copy the Go module files
COPY go.mod .
COPY go.sum .

# Download the Go module dependencies
RUN go mod download

COPY . .

RUN go build -o /myapp ./cmd/web
 
FROM alpine:latest as run

# Copy the application executable from the build image
COPY --from=build /myapp /myapp

WORKDIR /app
EXPOSE 8080
CMD ["/myapp"]

相关问题