遇到 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/