Redis Docker容器无法识别已复制的启动脚本问题
问题:多Redis容器启动脚本找不到,容器退出(退出码0)
场景说明
尝试通过同一个Dockerfile构建两个Redis容器,分别使用start-cache.sh和start-media.sh启动脚本配置密码、绑定主机、日志级别等参数,但运行docker compose后两个容器均退出(退出码0),提示启动脚本找不到。
相关配置文件
start-cache.sh
#!/bin/bash set -o errexit set -o pipefail set -o nounset redis-server --bind ${CACHE_REDIS_HOST} --save 60 1 --loglevel warning --requirepass ${CACHE_REDIS_PASSWORD}
start-media.sh
结构与start-cache.sh一致,仅Redis启动参数不同。
Dockerfile
FROM redis:7.2.1-alpine COPY ./compose/local/redis/cache/start-cache.sh /start-cache RUN sed -i 's/\r$//g' /start-cache RUN chmod +x /start-cache COPY ./compose/local/redis/media/start-media.sh /start-media RUN sed -i 's/\r$//g' /start-media RUN chmod +x /start-media
docker-compose.yml
.... media-cache: container_name: 'media_cache' build: context: . dockerfile: ./compose/local/redis/Dockerfile command: /start-media env_file: - .env ports: - 6371:6379 volumes: - ./data/mediaRedis:/data - ./compose/local/redis/redis.conf:/etc/redis/redis.conf restart: always db-cache: container_name: 'db_cache' build: context: . dockerfile: ./compose/local/redis/Dockerfile command: /start-cache env_file: - .env ports: - 6370:6379 volumes: - ./data/dbRedis:/data - ./compose/local/redis/redis.conf:/etc/redis/redis.conf restart: always ....
redis.conf
bind 0.0.0.0
错误信息
/usr/local/bin/docker-entrypoint.sh: exec: line 24: /start-media: not found
/usr/local/bin/docker-entrypoint.sh: exec: line 24: /start-cache: not found
解决方案
- 修正脚本shebang:Alpine Linux默认无bash,仅提供ash。将两个启动脚本的开头
#!/bin/bash改为#!/bin/sh或#!/usr/bin/env sh,确保解释器存在。 - 验证COPY路径:确认Dockerfile中的COPY路径相对于docker-compose.yml所在的build context(当前目录)正确。执行
docker compose build --no-cache重新构建镜像,避免缓存导致文件未复制。 - 检查镜像内文件:构建完成后,运行临时容器验证文件是否存在:
若文件不存在,需修正Dockerfile中的COPY路径。docker run --rm $(docker compose build --quiet db-cache) ls -l /start-cache /start-media - 显式指定解释器(可选):在docker-compose的command中直接指定解释器,绕过shebang问题:
command: sh /start-media
内容的提问来源于stack exchange,提问作者fullstacknoob
相关产品推荐
相关产品推荐

