英文:
Creating dockerfile for golang web application
问题
我尝试按照教程的步骤操作,但由于我的目录结构设置的原因,我似乎无法创建一个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 -o app .
替换为RUN go build cmd/web/ -o app .
,但是我仍然得到错误,说我的sum.go和mod.go在目录中不存在,这也是正确的。
如何为我的Web应用程序创建一个Docker容器,并使其在我的go文件位于不同目录的情况下构建?此外,当我正常运行我的Web应用程序时,我使用go run cmd/web/*.go
,其中cmd/web目录中的所有golang文件需要同时运行。因此,我还需要我的Dockerfile来构建和编译所有的golang文件。
英文:
I've tried following the tutorials out there, but for some reason, because of how my directories are set up, I can't seem to make a dockerfile to create a docker container for my web app so I can run it on multiple devices using docker.
Here is my project structure:
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
Here is the dockerfile I'm using:
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"]
I get the error that there are no go files in /build. This is correct and the error makes sense since the go files are in cmd/web/
However, I can't seem to fix it. I've tried doing:
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"]
Key difference here is that I've swapped out RUN go build -o app .
with RUN go build cmd/web/ -o app .
, and yet I get the error that my sum.go and mod.go are not present in the directory, which is also true
How do I make a docker container for my web app, and have it build in which my go files are in a different directory? Also, when I run my web app normally, I used go run cmd/web/*.go
in which all golang files in the cmd/web directory need to be run at the same time. Therefore, I also need my dockerfile to build and compile all the golang files together
=============================================
答案1
得分: 1
你的构建命令中有一个多余的点,并且参数的顺序错误:
RUN go build -o app ./cmd/web/...
正确的命令应该是:
RUN go build ./cmd/web/... -o app
英文:
There is an extra dot in your build command and wrong arguments order:
RUN go build -o app ./cmd/web/...
答案2
得分: 0
嗨 @Radin Khosraviani,
copy . .
只会复制源代码。你还需要复制 Go 模块文件
。
下面是我修改后的 Dockerfile,并添加了 COPY go.mod .
、COPY go.sum .
和 RUN go mod download
:
FROM golang:latest as build
WORKDIR /app
# 复制 Go 模块文件
COPY go.mod .
COPY go.sum .
# 下载 Go 模块依赖
RUN go mod download
COPY . .
RUN go build -o /myapp ./cmd/web
FROM alpine:latest as run
# 从构建镜像中复制应用可执行文件
COPY --from=build /myapp /myapp
WORKDIR /app
EXPOSE 8080
CMD ["/myapp"]
希望对你有帮助!
英文:
Hey @Radin Khosraviani,
copy . .
will only copy the source code. You need to copy the Go module files
as well.
Below I have modified your docker file and have added 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"]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论