Docker – 无法启动Redis服务

我正在安装Redis ,build立init.d ,把redis.conf放在init.d旁边。

然后使用CMD service init.d start启动Redis

但是, Redis-Server不启动,并且日志文件中没有指示服务启动失败。

  1. 安装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 
  1. 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。