首页 > 解决方案 > Docker:在 dockerfile 中启动 tmux 会话?

问题描述

tmux遇到未在 docker 容器文件中初始化的问题。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 会话中运行,我可以在图像运行时附加到该会话中。

构建过程中如何tmux在 docker 容器内启动?

标签: docker

解决方案


这是层的问题:

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

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

但它只会解决构建问题,而不是你的问题。

您应该在入口点执行此操作,因为 tmux 在层终止时被终止......

在每一层的构建过程中,您可以启动一些进程(您启动了 tmux)。层构建完成后,在该特定层中启动的所有进程都将被终止。

Container 只是只读镜像层之上的另一层,因此您需要从那里启动 tmux。

入口点是您在容器引导时运行的 bash 脚本。

示例入口点可以是:

#!/bin/bash
# entrypoint.sh

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

exec "$@"
  • 为您的 entrypoint.sh 添加可执行权限:
    chmod +x entrypoint.sh
  • 然后你需要在Dockerfile\ 中复制并执行它
    COPY ./entrypoint.sh /entrypoint.sh
    ENTRYPOINT ["/entrypoint.sh"]
    

另一种解决方案

在 docker 映像中启动多个程序是不好的做法。您正在失去主要的 docker 优势,即分离。

但是,官方文档对您的问题说了一句话:https ://docs.docker.com/config/containers/multi-service_container/

我真的很喜欢用supervisord. 这是一个管理程序的小程序。

参考


推荐阅读