【问题标题】:How to run golang web app on a Docker container如何在 Docker 容器上运行 golang Web 应用程序
【发布时间】:2018-11-28 09:42:15
【问题描述】:

我有一个使用 go 语言作为后端的网络应用程序。当我运行我的网站时,我只需执行go build; ./projectName 然后它将在本地服务器端口 8000 上运行。如何在容器上运行此 Web 应用程序?我可以在容器上运行像 nginx 这样的示例图像,但是如何为我的项目创建自己的图像。我使用以下代码在我的项目文件夹中创建了一个 Dockerfile:

FROM nginx:latest

WORKDIR static/html/

COPY . /usr/src/app

然后使用 Dockerfile 制作了一个图像,但是当我在容器上运行它并转到 localhost:myPort/static/html/page.html 时,它说找不到 404 页面。我的另一个问题是,docker 是否只能在容器上运行静态页面?因为我的网站可以接收和发送数据。谢谢

this is my docker file(./todo 是我的项目名和文件夹名)

this is my terminal(你可以看到容器立即退出)

【问题讨论】:

  • 在容器中运行 golang web 应用程序的最简单方法是从此处找到的官方 golang 图像开始:hub.docker.com/_/golang/ 并按照“在您的应用程序中启动 Go 实例”的说明进行操作部分。
  • 您可以尝试从 Docker 容器中访问 localhost 的端口。 as pointed out here

标签: docker go


【解决方案1】:

我猜你没有将 Docker 端口暴露在容器之外。 这就是为什么您无法看到任何输出而不仅仅是特定于 GO 程序的原因。 尝试将以下行添加到您的 docker compose 文件中

EXPOSE 80(whichever port you want it to be)
EXPOSE 443
EXPOSE 3306

这将使容器可以从外部访问

【讨论】:

  • 为什么要曝光三个?第一个是我的网络应用运行的端口?
【解决方案2】:

这是我为我的 GOlang Web 应用使用 Gin-gonic 框架所做的 - 我的 Dockerfile:

FROM golang:latest
# Author
MAINTAINER dangminhtruong
# Create working folder
RUN mkdir /app
COPY . /app
RUN apt -y update && apt -y install git
RUN go get github.com/go-sql-driver/mysql
RUN go get github.com/gosimple/slug
RUN go get github.com/gin-gonic/gin
RUN go get gopkg.in/russross/blackfriday.v2
RUN go get github.com/gin-gonic/contrib/sessions
WORKDIR /app 

然后构建docker镜像

docker build -t web-app:latest .

最后,启动我的网络应用

docker run -it -p 80:8080 -d web-app:latest go run main.go //My webapp start at 8080 port

希望对你有帮助

【讨论】:

  • 您的网络应用程序是独立运行还是在容器内运行?导致我的容器在运行后立即退出,但由于命令 //go build; 导致 Web 应用程序启动;项目名。所以我猜我的网络应用程序是独立运行的,而不是在容器内运行
  • 我的网络应用在容器内运行。你的容器立即停止我为它设置的入口点。你现在可以展示你的 dockerfile 了吗?
  • docker ps -a 然后复制您退出的 docker 容器名称 id。然后检查容器日志详细信息docker logs --details your_container_name 可能会有所帮助
【解决方案3】:
  1. 你不需要 Nginx 在 Go 中运行服务器
  2. 最好在 Dockerfile 中构建二进制文件

您的 Dockerfile 可能如下所示:

FROM golang:latest 
RUN mkdir /app 
ADD . /app/ 
WORKDIR /app 
RUN go build -o main .
EXPOSE 8000
CMD ["/app/main"]

【讨论】:

  • 什么是 CMD 命令,我应该执行 CMD["main.go"] 吗?我对 WORKDIR 感到困惑,你应该选择什么目录?谢谢
  • CMD 告诉你启动容器时将执行什么。您不需要运行 main.go,您需要先构建它(RUN go build -o main .),然后 /app/main 将是您的可执行路径。 WORKDIR 只是意味着你的容器的密码是什么。
  • 你如何让 docker 文件忽略一个包,因为我总是试图获取一个实际上只是我导入到我的 golang 代码中的文件夹的包,如果我使用 RUN 去获取 github.com /folderName 我仍然会收到错误,因为它不在 github 上,而只是一个文件夹。谢谢
  • “找不到包 github.com/rn1hd/todo/models”。但是在我的代码中,我刚刚导入了该文件夹,因为它包含我的一些 .go 文件,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多