Docker – 无法启动Redis服务
我正在安装Redis
,build立init.d
,把redis.conf
放在init.d
旁边。
然后使用CMD service init.d start
启动Redis
。
但是, Redis-Server
不启动,并且日志文件中没有指示服务启动失败。
- 安装
Redis
并将redis.conf
放在etc/init.d
文件夹中
命令:
# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added RUN groupadd -r redis && useradd -r -g redis redis RUN apt-get update > /dev/null \ && apt-get install -y curl > /dev/null 2>&1 \ && rm -rf /var/lib/apt/lists/* > /dev/null 2>&1 # grab gosu for easy step-down from root RUN gpg --keyserver pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 RUN curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture)" > /dev/null 2>&1 \ && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture).asc" > /dev/null 2>&1 \ && gpg --verify /usr/local/bin/gosu.asc > /dev/null 2>&1 \ && rm /usr/local/bin/gosu.asc > /dev/null 2>&1 \ && chmod +x /usr/local/bin/gosu > /dev/null 2>&1 ENV REDIS_VERSION 3.0.1 ENV REDIS_DOWNLOAD_URL http://download.redis.io/releases/redis-3.0.1.tar.gz ENV REDIS_DOWNLOAD_SHA1 fe1d06599042bfe6a0e738542f302ce9533dde88 # for redis-sentinel see: http://redis.io/topics/sentinel RUN buildDeps='gcc libc6-dev make'; \ set -x \ && apt-get update > /dev/null && apt-get install -y $buildDeps --no-install-recommends > /dev/null 2>&1 \ && rm -rf /var/lib/apt/lists/* > /dev/null 2>&1 \ && mkdir -p /usr/src/redis > /dev/null 2>&1 \ && curl -sSL "$REDIS_DOWNLOAD_URL" -o redis.tar.gz > /dev/null 2>&1 \ && echo "$REDIS_DOWNLOAD_SHA1 *redis.tar.gz" | sha1sum -c - > /dev/null 2>&1 \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 > /dev/null 2>&1 \ && rm redis.tar.gz > /dev/null 2>&1 \ && make -C /usr/src/redis > /dev/null 2>&1 \ && make -C /usr/src/redis install > /dev/null 2>&1 \ && cp /usr/src/redis/utils/redis_init_script /etc/init.d/redis_6379 && rm -r /usr/src/redis > /dev/null 2>&1 \ && apt-get purge -y --auto-remove $buildDeps > /dev/null 2>&1 RUN mkdir /data && chown redis:redis /data VOLUME [/data] WORKDIR /data
-
CMD Service init.d start
命令:
RUN touch /var/redis/6379/redis-6379-log.txt RUN chmod 777 /var/redis/6379/redis-6379-log.txt ENV REDISPORT 6379 ADD $app$/redis-config.txt /etc/redis/$REDISPORT.conf CMD service /etc/init.d/redis_6379 start
如果我使用shellinabox来访问容器,并且如果我input
/etc/init.d/redis_6379开始
Redis服务器将启动,但不会在dockerfile中启动。 为什么是这样?
看来你不能使用后台进程,而是你需要一个叫supervisord的东西。
安装:
RUN apt-get install -y supervisor RUN mkdir -p /var/log/supervisor ADD $app$/supervisord.conf /etc/supervisor/conf.d/supervisord.conf CMD /usr/bin/supervisord
configuration文件:
[supervisord] nodaemon=true [program:shellinabox] command=/bin/bash -c "cd /tmp && exec /opt/shellinabox/shellinaboxd --no-beep --service ${service}" [program:redis-server] command=/bin/bash -c "redis-server /etc/redis/${REDISPORT}.conf"
会发生什么事情是,命令执行后,它将启动程序shelllinabox和redis-server。
感谢大家的帮助!
通常,您不能在Docker容器中使用init
脚本。 这些脚本通常被devise为“在后台”启动服务,这意味着即使服务启动,脚本也最终退出。
如果这是你的Docker容器中的第一个进程,Docker会看到它退出,这将导致它清理容器。 您需要安排redis
在容器中的前台运行,否则您需要安排在容器中运行某种stream程pipe理器。
考虑看官方资源容器看看设置的一种方法。 你可以在github仓库中看到Dockerfiles。