在 Docker 中向 Golang 应用程序发送信号

2024-01-05

我正在尝试在 docker 容器内运行用 golang 编写的服务器。例如:

package main

import "net/http"

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello"))
  })
  http.ListenAndServe(":3000", nil)
}

If I run this code on my local machine, I can send it a SIGINT with Ctrl-C and it will close the application. When I run it inside a docker container, I can't seem to kill it with Ctrl-C.

# Dockerfile
FROM ubuntu:14.04

RUN apt-get update && apt-get -y upgrade
RUN apt-get install -y golang

ENV GOPATH /go

COPY . /go/src/github.com/ehaydenr/simple_server

RUN cd /go/src/github.com/ehaydenr/simple_server && go install

CMD /go/bin/simple_server

然后我继续使用 docker 向容器发送信号。

docker kill --signal=INT 9354f574afd4

仍在运行...

docker kill --signal=TERM 9354f574afd4

仍在运行...

docker kill --signal=KILL 9354f574afd4

终于死了。

我没有在代码中捕获任何信号并忽略它们。我什至尝试增强上面的代码来捕获信号并将其打印出来(这在我的主机上工作,但在容器中时,就好像信号从未到达程序一样)。

Has anyone experienced this before? I haven't tried something like this in another language, but I able to kill servers (e.g. mongo, nginx) using Ctrl-C while they're in a docker container.. Why isn't Go be getting the signals?

不确定这是否有什么不同,但我在 OSX 上并使用 docker-machine。

任何帮助深表感谢。


您在 shell 内运行服务器,而 shell 是接收信号的进程。在您强制 shell 退出之前,您的服务器不会退出。

当您使用 CMD 的“shell”形式时,它会作为参数启动您的服务器/bin/sh -c。为了直接执行服务器二进制文件,您需要向 CMD 或 ENTRYPOINT 提供一组参数,从可执行文件的完整路径开始。

CMD ["/go/bin/simple_server"]

来自 ENTRYPOINT 的注释Dockerfile 文档 https://docs.docker.com/reference/builder/:

shell 形式防止使用任何 CMD 或运行命令行参数,但缺点是您的 ENTRYPOINT 将作为 /bin/sh -c 的子命令启动,它不传递信号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Docker 中向 Golang 应用程序发送信号 的相关文章

随机推荐

  • 如何使用for循环matlab调用顺序变量? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一堆变量叫做length act
  • -O0、-O1 和 -g 有什么区别

    我想知道如何使用 O0 O1 和 g 在库中启用调试符号 有些建议使用 O0 来启用调试符号 有些建议使用 g 那么 g 和 O0 之间的实际区别是什么 01 和 O0 之间的区别是什么 哪个最好使用 O0是优化级别 0 无优化 与省略 O
  • 无法从“pyproj”导入名称“CRS”以使用 osmnx 库

    I have used a fresh anaconda install to download and install all the required modules for osnmx library but I got the fo
  • 我们什么时候使用ANTLR

    谁能指导我在 ASP Net C 项目中使用 ANTLR dll 的目的 我刚刚注意到antlr 运行时 Antlr3 运行时 Antlr3 实用程序某些项目中引用的程序集 如果能引用一些现实世界的例子或者任何指向网页的链接都会有用 那就太
  • 如何在文本区域更改时将“必需”属性添加到输入?

    我需要在文本区域 orderComments 中输入文本的情况下将 required 属性添加到 html select toDept 中 下面是我的代码 我缺少什么 我需要在更改事件或其他事件上运行 jquery 吗 document r
  • EJB企业应用程序不需要EJB接口

    我创建了一个 Java EE 应用程序并向 EJB 项目添加了一个无状态会话 bean EJB 项目是 web WAR 项目中的依赖项 我将在 EJB 项目中创建的 EJB 注入到我的一个 servlet 中 这工作正常 我能够在 Web
  • 我可以获取字符串形式的 saml-token 吗?

    我正在使用 spring security saml2 1 0 0 RELEASE 它运作良好 对我来说非常好 但新的要求提出了 我需要 saml token 作为字符串 我可以将 saml token 作为字符串获取吗 我在日志中找到 s
  • 在 Android Studio 2.3 上创建项目时出错

    我已将 Android Studio 从 2 2 升级到 2 3 当我创建带有导航活动的新 Android 项目时 出现两个错误 Error java util concurrent ExecutionException java lang
  • Java 9 的 Maven 编译问题

    尝试使用 JDK 9 0 1 编译 Maven 项目时 我遇到了这个堆栈跟踪 但没有太多解释 Exception in thread main java lang AssertionError at jdk compiler com sun
  • 使用 C# 为所有桌面快捷方式创建自定义右键单击上下文菜单项(Windows 资源管理器)

    问题很简单 我有很多桌面快捷方式 它们指向很多文件 但我也有很多快捷方式 它们指向这些快捷方式所指向的目录 我想通过简单地为所有快捷方式 lnk 文件 添加另一个右键菜单选项来消除这种冗余 该选项允许您将 explorer exe 打开到包
  • 使用 Google Apps 脚本将 Google 表格中的行追加到 Big Query 中的现有表

    我有一个 Google 表格 我想从中选择一些单元格并将它们作为行附加到 Big Query 中已存在的表格中 我编写了以下代码 运行时没有任何错误 但是当我检查 BQ 中的表时 它没有更新 function myFunction var
  • 让 MATLAB Mex 搜索特定文件夹中的库

    我创建了一个 mex 函数 它依赖于一个依赖于另一个库的库 当我执行该函数时 它在运行时输出以下错误 Invalid MEX file Library not loaded usr local lib libgomp 1 dylib 我的计
  • WPF 检查系统上是否安装了 python

    我的 wpf 应用程序调用 python 脚本来生成输出 稍后显示在 UI 中 如果用户系统上未安装 python 为了避免应用程序崩溃 我需要执行检查 目前我已经使用以下方法实现了这一点 ProcessStartInfo start ne
  • Groovy 重写compareTo

    我正在使用 Groovy 类别在 DSL 下工作 我需要覆盖 重载 操作员 然而却是已知问题 http jira codehaus org browse GROOVY 3364 当类实现Comparable Groovy 会调用compar
  • ORA-01830: 日期格式图片在转换整个输入字符串之前结束

    SQL 在大多数安装上都可以正常工作 但是 我在加拿大安装 Oracle 时遇到问题 可能是日期本地化问题 http www google com search q ORA 01830 http www google com search
  • 如何在 C 中将 double 转换为 int?

    double a a 3669 0 int b b a 我在 b 中得到 3668 而不是 3669 我该如何解决这个问题 如果有 3559 8 这样的我也想要 3559 而不是 3560 我怀疑你不知道actually有这个问题 我怀疑你
  • 同义词分析器不工作

    这是我的设置 countries aliases mappings country properties countryName type string settings index creation date 1472140045116
  • (Perl) 从文件读取字符串时是否可以插入变量?

    我正在编写一个脚本 其中有一些变量传递给字符串 然后将它们打印出来 初始字符串只有 6 行 我不需要外部文件 但现在我有了一个可以填充 1000 多行的新字符串 新字符串还有一些字段将被脚本中声明的变量替换 文本文件内容如下 Hello n
  • 如何在 Android 中以编程方式锁定屏幕? [复制]

    这个问题在这里已经有答案了 可能的重复 以编程方式锁定 Android 设备 https stackoverflow com questions 4545079 lock the android device programatically
  • 在 Docker 中向 Golang 应用程序发送信号

    我正在尝试在 docker 容器内运行用 golang 编写的服务器 例如 package main import net http func main http HandleFunc func w http ResponseWriter