You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dockerfile运行screen命令并保持附着的问题求助

解决Docker容器中Screen会话无法运行的问题

问题根源

  1. Alpine镜像无bash:你的脚本里用了bash -c,但Alpine默认只预装了sh,执行时会因找不到bash命令失败,导致Screen会话无法启动。
  2. Screen默认Detach导致容器退出:即使Screen启动成功,默认会自动脱离(detach),此时脚本执行完成,容器的主进程退出,容器随之停止,自然看不到Screen会话。
  3. Entrypoint写法冗余:脚本本身带有#!/bin/sh shebang,无需通过/bin/sh -c间接执行。

修复步骤

1. 修改run.sh脚本

将bash替换为sh,并让Screen后台启动会话的同时,保持容器主进程不退出:

#!/bin/sh
# -D -m 参数让Screen在后台启动独立会话
screen -S mc -D -m sh -c "java -jar paper-1.18.2-387.jar"
# 用tail命令维持容器主进程运行
tail -f /dev/null

或者直接让Screen作为前台进程运行(容器会持续运行直到Screen会话结束):

#!/bin/sh
# 直接启动Screen并保持附着,作为容器主进程
screen -S mc sh -c "java -jar paper-1.18.2-387.jar"

2. 优化Dockerfile

  • 合并apk安装命令减少镜像层数
  • 给脚本添加执行权限
  • 直接用脚本作为Entrypoint
FROM openjdk:18-alpine
# 一次性安装所需依赖
RUN apk --update add screen gcompat
WORKDIR /app
COPY . ./
COPY run.sh /run.sh
# 赋予脚本可执行权限
RUN chmod +x /run.sh
ENV LD_PRELOAD=/lib/libgcompat.so.0
# 直接以脚本作为Entrypoint
ENTRYPOINT ["/run.sh"]
EXPOSE 25565

3. 运行容器并附着Screen会话

启动容器时需分配终端并保持后台运行:

docker run -itd --name mc-server -p 25565:25565 -e TERM=xterm 你的镜像名

进入容器并附着Screen会话:

docker exec -it mc-server screen -r mc

内容的提问来源于stack exchange,提问作者kcode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:35:32