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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:04:59