【问题标题】:Docker: start tmux session inside of dockerfile?Docker:在 dockerfile 中启动 tmux 会话?
【发布时间】:2021-01-11 21:12:38
【问题描述】:

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

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

【问题讨论】:

    标签: docker


    【解决方案1】:

    这是层的问题:

    这段代码可以完成你的工作。

    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 entrypoint.sh
    • 那你需要在Dockerfile\中复制并执行
      COPY ./entrypoint.sh /entrypoint.sh
      ENTRYPOINT ["/entrypoint.sh"]
      

    其他解决方案

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

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

    我真的很喜欢用supervisord 来做这件事(当我必须做的时候)。这是一个管理程序的小程序。

    参考

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多