Docker发布不适用于golang应用程序

Madhav Jha:

我正在尝试通过docker运行golang Web服务器应用程序(该应用程序试图运行由支持golang blog的相同工具提供支持的go blog)。它在没有docker的情况下运行良好,但是如果我使用docker,则无法给出任何响应。我不知道为什么会发生这种情况,因为对于一个更简单的go Web应用程序,基于docker的相同方法效果很好。有关我使用的各种命令的输出,请参见下文。任何帮助将不胜感激。

docker pull maddyonline/gotutorial
docker run -d --publish 8080:8080 --name gotut maddyonline/gotutorial

81bc36e385286326a6d9f74322515a7b9748e493275c3426bcc6848a4589a7e7

docker ps

容器ID图像命令
创建的状态端口名称81bc36e38528 maddyonline / gotutorial“ go-wrapper run” 20秒前向上20秒0.0.0.0:8080->8080/tcp gotut

curl localhost:8080

curl:(52)来自服务器的空回复

docker exec gotut curl localhost:8080
<!DOCTYPE html>
<html>
<head>

和其余文件

我正在使用的docker文件非常简单。

FROM golang:onbuild
EXPOSE 8080

我在同一台服务器上使用更简单的golang应用程序对同一docker文件进行了实验。而且有效。

docker pull maddyonline/gowebapp
docker run -d --publish 8080:8080 --name gowebapp maddyonline/gowebapp
curl localhost:8080/icecream

嗨,我想我喜欢冰淇淋!

乔纳森:

我发现您当前的代码有两个问题。

首先是localhostmain.go需要的字符串0.0.0.0问题是您已告知Web服务器仅处理发送给的请求localhost由于Docker会造成网络混乱,因此显示在您Web服务器上的所有流量都不会像发送到那样看向Web服务器localhost通过告诉您的Web服务器进行侦听,0.0.0.0您可以有效地告诉它,它不在乎流量最初发送到的位置,它会接受所有流量。

var (
    httpFlag   = flag.String("http", "0.0.0.0:8080", "HTTP listen address") // <--- Here it the change. It's roughly line 25 of [main.go](https://github.com/maddyonline/gotutorial/blob/master/main.go#L25)
    originFlag = flag.String("origin", "", "web socket origin for Go Playground (e.g. localhost)")
    baseFlag   = flag.String("base", "", "base path for articles and resources")
)

第二个问题是由于您的导入路径与您onbuild要从其扩展Dockerfile 的预定目录结构相冲突。我看到您正在尝试对导入路径进行硬编码,这不是一个好主意,但是我认为这是您唯一的选择,因为Dockerfile go-wrapper强迫将其强加给您onbuild最终,您只需要让docker构建过程在该容器中粘贴一个静态Go二进制文件即可。这将简化在容器中实际启动服务器的过程。

我并没有弄乱Go代码中的路径,我想您可以解决这个问题,但是我确实抓住了上游onbuildDockerfile并根据需要对其进行了自定义。顺便说一句,如果您查看Dockerfile 文档onbuild它实际上说使用该Dockerfile是一个坏主意。;)因此,我接受了他们的建议,这是我的港口:

FROM golang:1.4.2

RUN mkdir -p /go/src/github.com/maddyonline/gotutorial
WORKDIR      /go/src/github.com/maddyonline/gotutorial

ADD . /go/src/github.com/maddyonline/gotutorial
RUN go-wrapper download
RUN go-wrapper install

EXPOSE 8080
CMD ["go-wrapper", "run"]

您的其他示例服务器应用程序没有相同的问题,因为导入路径的指定方式与项目中的指定方式不同。基本上,它不在乎它在哪里,因为它的依赖项没有被硬编码到文件路径中。它使用常规的Go打包约定。

抱歉,可能看起来有很多更改,但我希望它至少可以帮助您推进项目。让我知道是否没有任何意义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

InfluxDB docker镜像不适用于我的Spring Boot应用程序镜像

Docker服务运行状况检查不适用于Spring Boot应用程序

Itunes应用程序链接不适用于WkWebview

如何发布仅适用于iPhone而不适用于iPad的应用程序?

VSCode调试不适用于NodeJs应用程序

持续导出不适用于反应应用程序

通用应用程序NTLM适用于Windows应用商店,但不适用于Windows Phone

Github提交不适用于桌面应用程序

HTTPS请求不适用于android应用程序

SSH -X不适用于特定应用程序

API适用于Java应用程序,但不适用于JavaFX

AppIndicators不适用于电子应用程序(适用于Linux的Skype,Discord等)

Heroku 免费 SSL 用于付费 dynos 不适用于“旧”应用程序

自然滚动不适用于某些应用程序

简单搜索不适用于 rails 应用程序

我的应用程序不适用于 Marshmallow 但适用于 Nougat?

TabPane 不适用于我的应用程序

烧瓶路线不适用于gae应用程序

Angular 5 应用程序适用于生产构建,但不适用于开发构建

应用程序图标不适用于 Snap 打包

在 Kestrel 中托管 Angular 应用程序不适用于 Docker

POST 方法不适用于 Flask 应用程序

应用程序适用于 iphone 11 但不适用于 iphone 8

React 应用程序集代理不适用于 docker compose

getExpoPushTokenAsync 不适用于独立应用程序

我的 recyclerView 适用于调试,但不适用于“运行应用程序”

IMAPFolder getSortedMessages 不适用于 Liferay/Tomcat 但适用于常规 Java 应用程序

ControllerExceptionHandler 不适用于 Spring Boot 应用程序

节点计划不适用于 Express 应用程序