在Dockercontainer中启动golang webserver

时间:2015-06-29 21:05:44

标签: bash ubuntu go

我正在创建一项服务,其中包括允许用户随意启动/停止Golang Web服务器。为了让Nodejs服务器在类似情况下运行,我只需从容器启动时运行的批处理文件中发出nodejs /path/to/index.js &disown。基本位

ADD gorun.sh /usr/local/bin/gorun.sh
RUN 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/bash
go run /path/to/index.go & disown;
ps aux | grep go

现在这是奇怪的事情。我试图以两种方式启动Go服务器

  • 纯粹作为一个实验,我启动了Docker容器,终端附加了一个名为gorun的终端。 Golang服务器立即启动,一切都是hunkry-dory。
  • 为了更好地模拟现实世界中的工作方式 - 我在预先确定的位置放置了一个文件startgo.txt,然后由调用gorun的CRON作业拾取。这一次,没有快乐 - 服务器无法启动。

为什么不从Docker容器启动脚本中调用go run /path/to/index.go & disown?尝试过同样的结果:服务器无法启动。

我不清楚这里发生了什么。为什么Nodejs服务器启动而golang服务器拒绝空白?如果我从终端内运行相同的脚本,为什么会激活它?我非常感谢对这些问题的任何帮助。

1 个答案:

答案 0 :(得分:-3)

这个问题让我绕过弯道,迫在眉睫,我花了整整24小时才弄清楚发生了什么。问题是一个相当微妙的问题。所以这里是对任何遇到此线程的人的好处的解释。

永远不要忘记:为了让Golang发挥其魔力,操作系统必须能够找到它。输入$ GOPATH环境变量。如果你像我一样,你会按照网上的指示来说明如何做到这一点。我按照Vul {this post中的说明进行操作。他们建议的要点

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

优秀的说明 - 谢谢你Vultr。

Key Isssue

正如我在原始问题中提到的那样令我困惑的是当我执行包含

的批处理文件gorun
go run /path/to/index.go &

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

当你仔细考虑这一点并看看上面的Vultr指令中发生的事情时,这一切都是显而易见的。路径变量被设置为仅在交互式终端打开时! - 即当您尝试从任何旧批处理文件执行go dosomething指令时 - 例如,当您执行时Docker容器已启动。

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

export GOPATH="/opt/gopkg"; 
export GOROOT="/opt/go";   
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin;