在Docker Alpine镜像中安装Memcached遇连接拒绝问题求助
解决Dockerfile中Memcached启动后telnet连接失败的问题
咱们先拆解下你遇到的问题:在Dockerfile的RUN指令里启动Memcached后立刻执行telnet,出现了Connection refused错误,这背后有两个关键原因:
1. RUN阶段启动的服务无法在镜像中持续运行
Docker的RUN指令是镜像构建阶段执行的命令,每一条RUN都会创建一个临时容器,命令执行完成后这个临时容器就会被打包成镜像层,容器内的所有进程也会随之终止。你在RUN里用/usr/bin/memcached -v -d后台启动了Memcached,但这个进程只会存活在当前RUN的临时容器里,RUN步骤一结束,Memcached就被杀死了,后续的telnet自然连不上。
2. 后台启动后的即时telnet可能遭遇初始化延迟
就算忽略上面的问题,在同一个临时容器里,memcached -d是后台启动模式,命令会立刻返回,紧接着执行telnet时,Memcached可能还没完成端口监听的初始化工作,这也会导致连接被拒绝。
正确的Dockerfile调整方案
你需要把Memcached的启动命令放到CMD或者ENTRYPOINT中,这样容器启动时才会真正运行Memcached服务。另外,telnet测试不应该放在构建阶段,而是容器启动后再进行验证。
修改后的Dockerfile示例:
FROM alpine USER root RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/* \ && apk --no-cache add memcached busybox-extras WORKDIR /root/ COPY --from=builder /go/api/version/version . # 用shell脚本同时启动Memcached和你的version程序 CMD ["/bin/sh", "-c", "/usr/bin/memcached -v --user=root --port=11211 --listen=0.0.0.0 & ./version"]
额外提示
- 如果你的
version程序依赖Memcached,建议在启动version前加一点延迟(比如sleep 2),或者写个小脚本检查11211端口是否就绪,确保Memcached完全启动后再启动应用。 - 镜像构建阶段不需要做服务连通性测试,这类测试可以在容器启动后执行:
docker exec <你的容器ID> telnet 0.0.0.0 11211。
内容的提问来源于stack exchange,提问作者being of habits
相关产品推荐
相关产品推荐

