Запустить процесс с пользователем без полномочий root в контейнере докеров

Я создаю образ Redis Sentinal, который run.sh должен работать как пользователь без полномочий root.

run.sh

  while true; do
    master=$(redis-cli -h ${REDIS_SENTINEL_SERVICE_HOST} -p ${REDIS_SENTINEL_SERVICE_PORT} --csv SENTINEL get-master-addr-by-name mymaster | tr ',' ' ' | cut -d' ' -f1)
    if [[ -n ${master} ]]; then
      master="${master//\"}"
    else
      master=$(hostname -i)
    fi

    redis-cli -h ${master} INFO
    if [[ "$?" == "0" ]]; then
      break
    fi
    echo "Connecting to master failed.  Waiting..."
    sleep 10
  done

  sentinel_conf=/home/ubuntu/sentinel.conf

  echo "sentinel monitor mymaster ${master} 6379 2" > ${sentinel_conf}
  echo "sentinel down-after-milliseconds mymaster 60000" >> ${sentinel_conf}
  echo "sentinel failover-timeout mymaster 180000" >> ${sentinel_conf}
  echo "sentinel parallel-syncs mymaster 1" >> ${sentinel_conf}
  echo "bind 0.0.0.0" >> ${sentinel_conf}

  redis-sentinel ${sentinel_conf} --protected-mode no
}

function launchslave() {
  while true; do
    master=$(redis-cli -h ${REDIS_SENTINEL_SERVICE_HOST} -p ${REDIS_SENTINEL_SERVICE_PORT} --csv SENTINEL get-master-addr-by-name mymaster | tr ',' ' ' | cut -d' ' -f1)
    if [[ -n ${master} ]]; then
      master="${master//\"}"
    else
      echo "Failed to find master."
      sleep 60
      exit 1
    fi
    redis-cli -h ${master} INFO
    if [[ "$?" == "0" ]]; then
      break
    fi
    echo "Connecting to master failed.  Waiting..."
    sleep 10
  done
  sed -i "s/%master-ip%/${master}/" /redis-slave/redis.conf
  sed -i "s/%master-port%/6379/" /redis-slave/redis.conf
  redis-server /redis-slave/redis.conf --protected-mode no

Dockerfile

FROM alpine:3.4

RUN apk add --no-cache redis sed bash busybox-suid
#su: must be suid to work properly
COPY redis-master.conf /redis-master/redis.conf
COPY redis-slave.conf /redis-slave/redis.conf
RUN adduser -D ubuntu
USER ubuntu
COPY run.sh /home/ubuntu/run.sh
CMD [ "sh", "/home/ubuntu/run.sh" ]
ENTRYPOINT [ "bash", "-c" ]

Я развернул в Openshift. Контейнер постоянно перезапускается, и я также не вижу никаких журналов. Я видел некоторые журналы раньше, когда «run.sh» был root (по умолчанию), т.е. не упоминал никаких adduser в Dockerfile.


person Veerendra Kakumanu    schedule 02.04.2018    source источник


Ответы (1)


Согласно документации по docker. :

Both CMD and ENTRYPOINT instructions define what command gets executed when running a container.
There are few rules that describe their co-operation:
1. Dockerfile should specify at least one of CMD or ENTRYPOINT commands.
2. CMD will be overridden when running the container with alternative arguments.

Слои CMD и ENTRYPOINT полностью отличаются в приведенном выше Dockerfile, поэтому ENTRYPOINT переопределяет слой CMD, и поэтому слой CMD никогда не выполняется.

Просто удалите слой ENTRYPOINT из слоя Dockerfile, здесь он не нужен:

FROM alpine:3.4

RUN apk add --no-cache redis sed bash busybox-suid
#su: must be suid to work properly
COPY redis-master.conf /redis-master/redis.conf
COPY redis-slave.conf /redis-slave/redis.conf
RUN adduser -D ubuntu
USER ubuntu
COPY run.sh /home/ubuntu/run.sh
CMD [ "sh", "/home/ubuntu/run.sh" ]

Обновление:

Я вижу, что [[ ]] используется в сценарии run.sh. Эта конструкция работает в bash, а не в sh. Вот почему Dockerfile должно быть следующим:

FROM alpine:3.4

RUN apk add --no-cache redis sed bash busybox-suid
#su: must be suid to work properly
COPY redis-master.conf /redis-master/redis.conf
COPY redis-slave.conf /redis-slave/redis.conf
RUN adduser -D ubuntu
USER ubuntu
COPY run.sh /home/ubuntu/run.sh
CMD [ "bash", "/home/ubuntu/run.sh" ]
person nickgryg    schedule 02.04.2018
comment
Спасибо за ответ, который имеет смысл. Но все же я получаю отказ в разрешении. Пожалуйста, проверьте Update1 в вопросе. - person Veerendra Kakumanu; 02.04.2018
comment
@Veerendra добавил к ответу дополнительную информацию. - person nickgryg; 02.04.2018
comment
Спасибо еще раз. Я изучил проблему. Это связано исключительно с Openshift. В любом случае, согласно моему вопросу, ваш ответ правильный (это я удаляю Update1, чтобы не путать других пользователей) - person Veerendra Kakumanu; 02.04.2018