为了账号安全,请及时绑定邮箱和手机立即绑定

在 Docker 容器中启动 Golang 网络服务器

在 Docker 容器中启动 Golang 网络服务器

Go
慕斯709654 2021-10-18 15:15:11
我正在创建一个服务,除其他外,它允许用户随意启动/停止 Golang Web 服务器。为了让 Nodejs 服务器在类似情况下运行,我只需nodejs /path/to/index.js  &disown在容器启动时运行的批处理文件中发出一个。必要的位ADD gorun.sh /usr/local/bin/gorun.shRUN chmod +x /usr/local/bin/gorun.sh...ENTRYPOINT ["/bin/bash"]CMD ["/usr/local/bin/gorun.sh"]每次都可以完美运行。在gorun.sh我有nodejs /path/to/index.js & disown线路。现在我正在尝试让 Golang Web 服务器在类似条件下运行,我想我会尝试相同的方法。我修改了 gorun.sh 脚本来读取#! /bin/bashgo run /path/to/index.go & disown;ps aux | grep go现在奇怪的是。我尝试通过两种方式启动 Go 服务器纯粹作为一个实验,我启动了 Docker 容器,并gorun从终端调用了一个终端。Golang 服务器立即启动,一切都很正常。为了更好地模拟现实世界中的工作方式 - 我将一个文件 startgo.txt 放在一个预先确定的位置,然后由一个调用 gorun 的 CRON 作业获取。这一次,没有快乐 - 服务器没有启动。为什么不直接go run /path/to/index.go & disown从 Docker 容器启动脚本调用?也尝试过,结果相同:服务器无法启动。我不清楚这里发生了什么。为什么 Nodejs 服务器启动而 Golang 服务器拒绝点空白?如果我在终端内运行相同的脚本,为什么它会启动?
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

这个问题驱使我在迫在眉睫的最后期限前转过弯,我花了整整 24 小时才弄清楚发生了什么。这个问题是一个相当微妙的问题。所以这里是为了任何遇到这个线程的人的利益的解释。


永远不要忘记:为了让 Golang 发挥它的魔力,操作系统必须能够找到它。输入 $GOPATH 环境变量。如果你像我一样,你会按照网上某处的说明进行操作。我按照Vultr 上这篇文章中的说明进行操作。他们建议的要点


echo export GOPATH=/opt/gopkg >> ~/.bashrc

echo export GOROOT=/opt/go >> ~/.bashrc

echo export PATH=$PATH:$GOROOT/bin:$GOPATH/bin >> ~/.bashrc

很棒的说明 - 谢谢 Vultr。


关键问题


正如我在最初的问题中提到的,令我感到困惑的是,当我执行gorun包含


go run /path/to/index.go &

从附加到它工作的 Docker 会话的终端会话。但是,当我尝试从 Docker 会话开始时执行的 bash 脚本执行它时,它没有。


当您稍微思考一下并查看上面 Vultr 说明中发生的事情时,一切都非常明显。只有在交互式终端打开时才设置路径变量!- 即不是当您尝试go dosomething从任何旧的批处理文件执行指令时 - 例如您在 Docker 容器启动时运行的那个。


如果您想让 Golang 在容器启动时运行的 bash 脚本顶部的 Docker 容器内正确运行,则需要发出


export GOPATH="/opt/gopkg"; 

export GOROOT="/opt/go";   

export PATH=$PATH:$GOPATH/bin:$GOROOT/bin; 


查看完整回答
反对 回复 2021-10-18
  • 1 回答
  • 0 关注
  • 320 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信