构建docker镜像时如何修改`core_pattern`

GOG*_*OGO 9 docker dockerfile

我想修改core_pattern构建docker镜像时的内容,我的docker文件是这样的:

FROM centos:7
RUN echo "core-%e" > /proc/sys/kernel/core_pattern
Run Code Online (Sandbox Code Playgroud)

然后我运行docker build并得到一个错误

/bin/sh: /proc/sys/kernel/core_pattern: Read-only file system
Run Code Online (Sandbox Code Playgroud)

有人帮忙吗?

Seb*_*ian 7

主机和容器中不可能同时具有不同的 core_pattern,因为 docker 与其主机共享内核。
但是,您可以在特权模式下运行容器,并在启动/运行时从容器内部更改 core_pattern(在 CMD 部分修改 core_pattern 或从内部执行 os 命令)。
但请记住,容器完成后此设置不会自动恢复(除非您以编程方式执行此操作)。


Mat*_* J. 0

我自己也需要这个,我刚刚知道如何做。它与 docker 无关,而是与一般的 linux 有关。我正在使用 ubuntu,并且我 99% 确定 centos 在这方面也会表现相同。

它是通过sysctl命令编辑的。

参见示例

bash$ cat /proc/sys/kernel/core_pattern 
|/usr/share/apport/apport %p %s %c %d %P %E
bash$ sudo sysctl -w kernel.core_pattern="|/usr/share/apport/apport-kde %p %s %c %d %P %E"
kernel.core_pattern = |/usr/share/apport/apport-kde %p %s %c %d %P %E
bash$ cat /proc/sys/kernel/core_pattern 
|/usr/share/apport/apport-kde %p %s %c %d %P %E
bash$
Run Code Online (Sandbox Code Playgroud)

请注意,以 开头的值|表示命令。核心转储将作为 STDIN 发送到命令

既然您问了有关 docker 的问题,那么让我也提供一个兼容的答案。

FROM centos:7
RUN sudo sysctl -w kernel.core_pattern="core-%e"
Run Code Online (Sandbox Code Playgroud)

有关可以在文件中使用的核心模式的更多信息,而不仅仅是 %e,请参阅https://sigquit.wordpress.com/2009/03/13/the-core-pattern/

还有另一个相关的问题/答案,有更多细节

https://unix.stackexchange.com/questions/343275/why-is-editing-core-pattern-restricted

  • 此答案中的 RUN 步骤给出了与原始问题中相同的“只读文件系统”错误,因为非特权容器无法修改“/proc/sys”。所以,除非我错过了一些重大的事情,否则我认为这个答案不应该被接受。 (4认同)
  • 奇怪的是,这是我第一次使用 Docker 遇到“它对我有用”的情况。`sudo sysctl` 在主机上工作,但是当在此答案中构建 Dockerfile 时(没有 `sudo`,因为在 `centos:7` 映像中,默认用户已经是 `root`),我得到“只读” “ 错误。@MathieuJ。您能确认您运行了“docker build.”并且它有效吗? (2认同)