使用docker启动redis服务遇到的一个坑

本文记录了在使用docker-compose启动redis服务时遇到的报错问题,由于docker-entrypoint.sh不可执行导致服务无法启动。经过尝试更换镜像、修改Dockerfile、调整命令顺序等方法,最后发现是redis.conf文件挂载路径导致的权限问题,修正挂载路径后问题解决。

使用docker启动redis服务遇到的一个坑

问题

最近一个项目需要依赖redis,把之前使用的redis的 docker-compose下载下来,启动一下就OK了。但是因为一个报错,花了1个多小时才解决,在此记录一下。

docker-compose文件如下:

version: "3"
services:
  some_redis:
    container_name: some_redis
    image: redis:6.0.16
    volumes:
      - ./conf:/usr/local/
    ports:
      - "6379:6379"
    restart: always
    command: redis-server /usr/local/redis.conf

docker-compose up -d 启动后报以下错误:

Creating some_redis ... error
ERROR: for some_redis  Cannot start service some_redis: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "docker-entrypoint.sh": executable file not found in $PATH: unknown
ERROR: for some_redis  Cannot start service some_redis: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "docker-entrypoint.sh": executable file not found in $PATH: unknown
ERROR: Encountered errors while bringing up the project

过程

按照提示 docker-entrypoint.sh可执行文件找不到,想着之前启动没遇到这个问题哇,就又尝试重启了好几次,还是报一样的错。换了镜像版本、增加了PATH环境变量也不行.

上网查了一下这个错误:大部分的信息是修改redis 中 Dockerfile 命令,增加 下面命令: RUN chdmo 777 /usr/local/bin/docker-entrypoint.sh && link -s /usr/local/bin/docker-entrypoint.sh

或是说因为基础镜像的原因,需要把docker-entrypoint.sh的 #!/bin/bash改为 #/bin/sh,不过这个问题在docker-library/redis 已经修复了

下载了https://github.com/docker-library/redis/blob/master/6.2/Dockerfile redis dockerfile,增加了上面的命令,重新build新的redis镜像,重新执行 docker-compose up -d 还是一样的报错。。。

把dockerfile中 ENTRYPOINT ["docker-entrypoint.sh"] 改为绝对路径 ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"] 也不行。

why?

一般情况 遇到这种明显报错问题,1小时还未解决的,我会把问题放一放,一般这种情况要不是非常基础的错误,要不是排查方向错了

晚会儿后我发现,直接执行dockerhub 给的启动的命令是可以的:

$ docker run -v /myredis/conf:/usr/local/etc/redis --name myredis redis redis-server /usr/local/etc/redis/redis.conf

解决

最后发现是我docker-compose中 redis.conf 文件挂载到/usr/local 目录下导致的,挂载目录改为 /usr/local/etc/redis下问题解决。

推测应该是容器内redis-server进程没有权限读取/usr/local/redis.conf文件导致的 这个错误:

ERROR: for some_redis Cannot start service some_redis: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: “docker-entrypoint.sh”: executable file not found in $PATH: unknown

这个报错信息太不准确了…

后上网搜索了一番,一些docker命令参数顺序不一致也会报这个错

最终的docker-compose.yaml 如下:

version: "3"
services:
  some_redis:
    container_name: some_redis
    image: redis:6.2
    volumes:
      - /data/soft/redis/conf:/usr/local/etc/redis
      - /data1/service_data/redis/data:/data
    ports:
      - 6379:6379
    restart: always
    command: redis-server /usr/local/etc/redis/redis.conf


https://github.com/huarong8/new_project_docker_compose

这个项目是我维护的常见的web项目的docker-compose,现在支持redis、mysql、nginx后面会慢慢维护起来

### ### Docker 启动 Redis 失败的常见原因及解决方法 在使用 Docker 启动 Redis 时,可能会遇到容器无法正常启动的问题。常见原因包括配置文件格式错误、权限问题、AOF 文件损坏、挂载路径配置不当等。以下是一些常见问题的排查和解决方法。 #### 1. 配置文件格式错误 Redis 容器启动时会加载指定的 `redis.conf` 文件,如果配置文件中存在格式错误,容器将无法启动。可以通过以下方式排查: - 使用 `redis-server --test-memory` 或 `redis-server --configtest` 命令检查配置文件是否正确。 - 确保挂载的 `redis.conf` 文件路径正确,并且 Redis 有权限读取该文件。 - 如果使用自定义配置文件,建议从官方示例配置文件开始修改,避免语法错误。 ```bash redis-server --configtest /path/to/redis.conf ``` 如果发现配置文件问题,需根据提示修正后再重新启动容器 [^3]。 #### 2. 权限问题 在某些系统(如 SELinux 或 AppArmor 启用的环境)中,Docker 容器可能因权限限制无法访问挂载的目录或文件。可以尝试以下方法: - 确保挂载的目录(如 `/usr/data/redis/conf/` 和 `/usr/data/redis/data/`)具有正确的读写权限。 - 在 `docker run` 命令中添加 `--privileged` 参数以提升容器权限(仅限测试环境使用)。 - 使用 `:z` 或 `:Z` 标志挂载卷以解决 SELinux 权限问题: ```bash docker run -d \ -p 6379:6379 \ --name redis \ -v /usr/data/redis/conf/redis.conf:/etc/redis/redis.conf:z \ -v /usr/data/redis/data:/data:z \ redis redis-server /etc/redis/redis.conf ``` 该方式可以避免因 SELinux 限制导致的文件访问失败 [^1]。 #### 3. AOF 文件损坏 如果 Redis 使用 AOF 持久化方式,并且 AOF 文件损坏,容器将无法正常启动。此时会提示类似以下错误: ``` Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> ``` 可以使用 `redis-check-aof` 工具修复损坏的 AOF 文件: ```bash redis-check-aof --fix appendonly.aof ``` 修复完成后,重新启动容器即可恢复正常 [^4]。 #### 4. 挂载路径配置不当 启动 Redis 容器时,需要正确挂载配置文件和数据目录。例如: ```bash docker run -d \ -p 6379:6379 \ --name redis \ -v /usr/data/redis/conf/redis.conf:/etc/redis/redis.conf \ -v /usr/data/redis/data:/data \ --restart unless-stopped \ redis redis-server /etc/redis/redis.conf ``` 上述命令中,`-v` 参数用于挂载配置文件和持久化数据目录,`--restart unless-stopped` 表示容器随 Docker 服务自动启动,除非手动停止容器 [^2]。 #### 5. Redis 版本兼容性问题 某些情况下,使用 `redis:latest` 镜像拉取到的版本可能与旧配置不兼容,导致启动失败。建议明确指定版本号,如使用 `redis:5.0.7`: ```bash docker run -d \ -p 6379:6379 \ --name redis \ -v /usr/local/redis.conf:/etc/redis/redis.conf \ -v /usr/local/data:/data \ redis:5.0.7 redis-server /etc/redis/redis.conf ``` 这样可以避免因版本升级导致的兼容性问题 [^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值