Docker:如何在Dockerfile中启动tmux会话?

4
在docker容器中,tmux无法初始化导致出现问题。此外,还存在搜索阻塞,因为有人将tmux连接到预先存在的容器上,而这不是我想要做的事情。
# in the dockerfile
FROM debian:latest
RUN apt-get install tmux
RUN tmux new -s foo -d
RUN tmux ls
_________________________

$: docker build . 
...
 > [8/8] RUN tmux ls:
#11 0.415 no server running on /tmp/tmux-0/default
------
executor failed running [/bin/sh -c tmux ls]: exit code: 1

我想要做的是同时运行需要相互通信的几个“应用程序”。我的想法是避免针对这个特定问题使用docker compose。

我可以轻松地将这两个命令作为后台进程运行。

但是,我更愿意让它们在一个tmux会话中运行,这样当图像正在运行时,我就可以附加到它们上面。

如何在构建过程期间在docker容器内启动tmux

1个回答

3

图层存在的问题:

这段代码将完成你的工作。

FROM debian:latest
RUN apt-get update && apt-get install -y tmux
RUN tmux new -s foo -d && tmux ls

但这只能解决构建问题,而不能解决你的问题。

你应该在入口点(entrypoint)中执行该操作,因为当该层(layer)被终止时,tmux 也会被杀死......

在构建每个层时,您可以启动一些进程(例如启动tmux)。在特定层中启动的所有进程在该层构建完成后将被杀死。

容器只是另一个基于只读镜像层的层,因此您需要在其中启动tmux。

Entrypoint 是一个 bash 脚本,当容器引导时运行它。

示例 entrypoint 可以是:

#!/bin/bash
# entrypoint.sh

set -eu
tmux new -s foo -d && tmux ls

exec "$@"
  • Add executable permissions for your entrypoint.sh:
    chmod +x entrypoint.sh
  • Then you need to copy and execute it in Dockerfile \
    COPY ./entrypoint.sh /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    

其他解决方案

在Docker镜像中启动多个程序是不好的做法。您会失去最主要的Docker优势,即隔离性。

但是,官方文档对您的问题有所提及:https://docs.docker.com/config/containers/multi-service_container/

当我必须这样做时,我真的很喜欢使用supervisord。这是一个小程序,用于管理您的程序。

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接