Docker中以openssl s_server为ENTRYPOINT无法正常工作的问题
问题分析与解决
核心原因
openssl s_server默认是单连接模式:处理完一个客户端连接(包括TLS握手完成、交互结束或客户端主动断开)后,进程会立即退出。
当它作为容器的PID 1进程(通过ENTRYPOINT启动)时,进程退出会直接触发容器停止,因此你尝试连接时,刚完成握手服务器就退出,容器随之终止,表现为“连接失败”。
而通过docker exec在容器内启动的openssl s_server不是PID 1,进程退出不会影响容器运行,因此你可以正常完成一次连接交互,直到断开后进程才退出,看起来连接成功。
解决方案
在openssl s_server的启动参数中添加-forever选项,让服务器处理完单个连接后不退出,持续监听新连接:
修改Docker Compose的command配置:
command: s_server -debug -CAfile /sshfiles/rootCA.crt -key /sshfiles/usage.key -cert /sshfiles/usage.crt -port 9998 -Verify 3 -verify_return_error -forever
如果需要保持单连接逻辑但避免容器随进程退出,可以用tini这类轻量进程管理器包裹启动命令,但-forever是最直接解决问题的方式。
验证步骤
- 修改配置后重启容器:
docker compose up -d tlstcp - 用
s_client连接服务器,此时连接建立后不会立即中断,可正常交换文本 - 断开连接后,服务器会继续监听,容器保持运行状态
补充说明
- 本地直接运行
openssl s_server时,因为它不是系统PID 1,进程退出不会影响系统,所以你感觉“正常工作”,但实际上它同样是处理一次连接就退出,只是你可以随时重新启动。 - 容器的PID 1进程有特殊的生命周期特性:进程退出会直接终止容器,这是Linux容器的基础机制。
内容的提问来源于stack exchange,提问作者JeanMarc
相关产品推荐
相关产品推荐

