Dockerfile运行screen命令并保持附着的问题求助
解决Docker容器中Screen会话无法运行的问题
问题根源
- Alpine镜像无bash:你的脚本里用了
bash -c,但Alpine默认只预装了sh,执行时会因找不到bash命令失败,导致Screen会话无法启动。 - Screen默认Detach导致容器退出:即使Screen启动成功,默认会自动脱离(detach),此时脚本执行完成,容器的主进程退出,容器随之停止,自然看不到Screen会话。
- Entrypoint写法冗余:脚本本身带有
#!/bin/shshebang,无需通过/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
相关产品推荐
相关产品推荐

