docker - 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 容器内启动?
解决方案
这是层的问题:
这段代码将完成你的工作。
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
. 这是一个管理程序的小程序。
参考
推荐阅读
- selenium - 在 Firefox Selenium IDE 上看不到文件/编辑/操作菜单栏
- php - 显示空白字段的服务器端验证以及从一页到另一页显示消息的最佳方式是什么?
- jquery - 平滑引导列下降
- scala - Spark 提交并行作业
- if-statement - 在 CLIPS 中使用 if-then-else 和事实
- jquery - 在 React 应用程序中无法弄清楚 Spotify 的授权
- android-studio - com.android.support:appcompat-v7:27.1.1 与 media-compat:25.2.0 不匹配
- python-3.x - 减少火花返回字典而不是数据帧中的操作
- git - 合并来自拉取请求的单个提交
- python - Python 子类的 Pythonic 方式