我正在创建一项服务,其中包括允许用户随意启动/停止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服务器
gorun
的终端。 Golang服务器立即启动,一切都是hunkry-dory。为什么不从Docker容器启动脚本中调用go run /path/to/index.go & disown
?尝试过同样的结果:服务器无法启动。
我不清楚这里发生了什么。为什么Nodejs服务器启动而golang服务器拒绝空白?如果我从终端内运行相同的脚本,为什么会激活它?我非常感谢对这些问题的任何帮助。
答案 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;