容器处于EXIT 2状态,疑与Dockerfile相关,求排查调试建议
容器Exit 2状态的调试排查建议
以下是针对该问题的具体排查步骤:
查看容器启动日志
直接获取容器的错误输出是最快速定位问题的方式,执行命令:docker-compose logs redisapi # 或者 docker logs redisapiExit 2通常是程序启动失败的退出码,日志里会包含具体的错误信息(比如Redis连接失败、配置错误、依赖缺失等)。
检查Go程序的Redis连接配置
你的Redis服务设置了密码mypassword,且在Docker Compose的内部网络中,服务名为redis。需要确认Go代码中Redis客户端的初始化是否正确:// 示例正确配置(参考storage_service.go中的初始化逻辑) client := redis.NewClient(&redis.Options{ Addr: "redis:6379", // 必须用Docker内部服务名,不能用localhost Password: "mypassword", // 与docker-compose.yml中的密码一致 DB: 0, })如果代码中使用
localhost:6379或者未配置密码,会直接导致连接失败,程序退出。调整容器启动顺序
当前Go服务没有依赖Redis的启动状态,可能出现Go服务启动时Redis还未完全就绪的情况。修改docker-compose.yml添加依赖和健康检查:version: "3.8" services: redis: container_name: "redis" image: redis:alpine command: redis-server /usr/local/etc/redis/redis.conf --requirepass mypassword ports: - "6379:6379" volumes: - $PWD/redis.conf:/usr/local/etc/redis/redis.conf # 添加Redis健康检查 healthcheck: test: ["CMD", "redis-cli", "-a", "mypassword", "ping"] interval: 5s timeout: 3s retries: 3 go: container_name: "redisapi" build: context: . ports: - "8080:8080" # 等待Redis健康后再启动 depends_on: redis: condition: service_healthy验证二进制文件的可执行性
进入容器交互式环境,直接测试二进制文件的运行情况:docker-compose run --rm go sh # 在容器内执行 ls -l main # 检查是否有可执行权限(x位) ./main # 直接运行,查看实时错误输出确认工作目录与文件路径
Dockerfile中设置的工作目录是/go/src/github.com/urlshortener,COPY命令会将本地文件复制到该目录下。可以在容器内检查文件是否存在:docker-compose run --rm go ls -l /go/src/github.com/urlshortener检查Redis配置文件的有效性
查看Redis容器的日志,确认自定义配置文件是否加载正常:docker-compose logs redis如果配置文件存在语法错误,可能导致Redis服务异常,间接影响Go服务的连接。
内容的提问来源于stack exchange,提问作者programmerbee
相关产品推荐
相关产品推荐

