【问题标题】:How I can make autorestarts golang application in Docker container?如何在 Docker 容器中自动重启 golang 应用程序?
【发布时间】:2019-10-16 21:00:29
【问题描述】:

我有带有 Golang 和 Mongo 的 Docker 容器。我想制作电报机器人,并且我想在更改源代码时自动重新编译/重新运行我的 go 应用程序。 我尝试使用mitranim/gow,但没有成功。

更改源代码后,我需要使用什么来自动重新运行我的 go 应用程序?对于nodejs,我需要任何似乎nodemon的东西,但是对于go

这是我的 docker-composedockerfile 配置。

My host machine is win10

【问题讨论】:

  • 类似这样的:github.com/codegangsta/gin ?
  • 好的,谢谢。但它看起来很奇怪,当我在使用“docker exec -it machninename /bin/bash”连接到 docker 后手动运行“gin --all -i run main.go”时它可以工作,但是如果我在 dockerfile 中编写命令,例如"RUN ["gin", "--all", "-i", "run", "main.go"]" 编译一次,修改后不重新编译。
  • 我发现,如果我使用命令“touch”在 docker 终端中标记文件已更改,它就可以工作。但是,如果我从主机(Windows)更改编辑器中的文件,它就不起作用。 Windows 上的 docker 似乎很麻烦

标签: docker go docker-compose


【解决方案1】:

Linux 上的大多数文件监控工具都使用inotify 作为首选机制。您提到的工具mitranim/gow 似乎属于同一类。

问题是在 Windows 中对文件系统的更改不会导致 Linux 来宾发布事件。这是意料之中的,因为 Windows 不“知道”已设置监视,因此无法在文件更改时通知 Linux 容器。这是虚拟化环境或其他跨平台/网络文件系统共享解决方案的常见问题。

您可能想查看类似的问题:Inotify on shared drives does not work

该问题的一个可能解决方案是使用轮询。 nodemon 有一个 legacyWatch 标志,可以在文件更改时运行任何命令:

在一些网络环境中(比如运行 nodemon 的容器 读取已安装的驱动器),您将需要使用 legacyWatch: true 启用 Chokidar 的轮询。

例子:

nodemon --legacy-watch <working-dir> -e go --exec "go run main.go"

或者将nodemon 与其他监控工具结合使用,方法是让nodemon 在检测到文件更改时触摸文件(有点黑客行为):

nodemon --legacy-watch <working-dir> -e go --exec "touch main.go"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多