Docker:在 dockerfile 中启动 tmux session ?

标签 docker

遇到 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 session 中运行,我可以在图像运行时附加到该 session 中。

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

最佳答案

这是图层的问题:

此代码将完成您的工作。

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

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

你应该在入口点这样做,因为当层终止时 tmux 被杀死......

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

容器只是只读图像层之上的另一层,因此您需要在那里启动 tmux。

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

示例入口点可以是:

#!/bin/bash
# entrypoint.sh

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

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

另一种解决方案

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

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

我真的很喜欢用 supervisord 来做(当我不得不这样做的时候)。这是一个管理程序的小程序。

引用资料

关于Docker:在 dockerfile 中启动 tmux session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65674604/

相关文章:

docker - iOS 11 设备无法访问由 LetsEncrypt 保护的 nginx HTTPS 站点(协议(protocol)错误)

php - 注意:使用未定义的常量GLOB_BRACE

php - 错误:Dockerfile解析错误行4:未知指令:PHP7

node.js - 启动 Node docker 容器以从 VS Code 进行调试

docker 撰写 : Change volume mapping from a docker volume to a folder on the server

docker - 如何在 Dockerfile 中设置镜像名称?

python+docker : docker volume mounting with bad perms, 数据默默丢失

scala - 无法连接到 Docker 实例中的 HBase

bash - 如何使用 bash 命令强制取消 dockerbuild?

docker - 更好的 docker 镜像方法