Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker - Cannot start Redis Service

Tags:

docker

redis

I'm installation Redis, setting up init.d, placed the redis.conf beside init.d.

Then using CMD service init.d start to start Redis.

However, Redis-Server does not start, and there are no indiciation in the log file that the service failed to start.

  1. Installing Redis and Placing redis.conf to the etc/init.d folder

Commands:

# 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

Command:

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 

If I use shellinabox to access the container, and if I type in

/etc/init.d/redis_6379 start

Redis server will start, but it won't start in the dockerfile. Why is this?


It seems that you cannot use background processes, but instead you need something called supervisord.

To Install:

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 File:

[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"

What happens is that after the command is executed, it will start both programs shelllinabox and redis-server.

Thanks everyone for the help!

like image 306
user1157751 Avatar asked Mar 18 '26 19:03

user1157751


1 Answers

In general, you can't use an init script inside a Docker container. These scripts are typically designed to start a service "in the background", which means that even if the service starts, the script ultimately exits.

If this is the first process in your Docker container, Docker will see it exit, which will cause it to clean up the container. You will need to arrange for redis to run in the foreground in your container, or you will need to arrange to run some sort of process supervisor in your container.

Consider looking at the official resource container to see one way of setting things up. You can see the Dockerfiles in the github repository.

like image 110
larsks Avatar answered Mar 21 '26 08:03

larsks



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!