Точка входа Dockerfile не может сменить пользователя

Я не могу переключить пользователя на пользователя без полномочий root из сценария точки входа. Директива User для смены пользователя в Dockerfile работает, но я не могу изменить разрешения с помощью chmod. Чтобы решить эту проблему, я создал скрипт entrypoint.sh для изменения прав доступа к папке, но когда я пытаюсь переключить пользователя с помощью команды su, он, по-видимому, не работает, контейнер все еще работает от имени пользователя root.

Докерфайл

FROM php:7.2-fpm

# Installing dependencies
RUN apt-get update && apt-get install -y \
    build-essential \
    mysql-client \
    libpng-dev \
    libjpeg62-turbo-dev \
    libfreetype6-dev \
    locales \
    zip \
    jpegoptim optipng pngquant gifsicle \
    vim \
    unzip \
    git \
    curl

# Installing composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

ENV USER_ID=1000
ENV GROUP_ID=1000
ENV USER_NAME=www
ENV GROUP_NAME=www

RUN groupadd -g $GROUP_ID $GROUP_NAME
RUN useradd -u $USER_ID -ms /bin/bash -g $GROUP_NAME $USER_NAME
RUN mkdir /app
WORKDIR /app

EXPOSE 9000

COPY ./entrypoint.sh /
RUN ["chmod", "+x", "/entrypoint.sh"]
ENTRYPOINT ["/entrypoint.sh"]

Файл Entrypoint.sh

#!/bin/bash
if [ -n "$USER_ID" -a -n "$GROUP_ID" ]; then
    chown -R $USER_NAME:$GROUP_NAME .
    su $USER_NAME
fi

php-fpm

exec "$@"

что бы я ни делал, я не могу переключить пользователя из сценария entrypoint.sh.

Мой случай - запустить контейнер от имени пользователя без полномочий root.


person Faizan    schedule 15.10.2018    source источник
comment
Это лучший способ сделать это: stackoverflow.com/a/47410394/10299604   -  person Frank Escobar    schedule 11.03.2021


Ответы (2)


Я думаю, что ваша команда su должна быть чем-то вроде

su $USERNAME --command "/doit.sh"

b/c ваш сценарий entrpoiny переключает пользователя, ничего не делая, а затем переключается обратно на root.

person emory    schedule 15.10.2018
comment
Мне нужно запустить контейнер как пользователь без полномочий root. После смены пользователя команда php-fpm не выполняется и соответственно сервер не запускается. - person Faizan; 15.10.2018
comment
Я знаю. Если вы используете переключатель --command, он будет использовать doit.sh как пользователя. Все, что находится за пределами doit.sh, выполняется от имени пользователя root. - person emory; 15.10.2018

Чтобы решить эту проблему, вам нужно изменить свой файл докеров и добавить:

RUN echo "root  ALL = NOPASSWD: /bin/su ALL" >> /etc/sudoers

Или используйте gosu, что лучше:

# install gosu
# seealso:
# https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
# https://github.com/tianon/gosu/blob/master/INSTALL.md
# https://github.com/tianon/gosu
RUN set -eux; \
    apt-get update; \
    apt-get install -y gosu; \
    rm -rf /var/lib/apt/lists/*; \
# verify that the binary works
    gosu nobody true

Затем внутри entrypoint.sh:

gosu root yourservice &
#ie: gosu root /usr/sbin/sshd -D &

exec gosu no-root-user yourservice2
# ie: exec gosu no-root-user tail -f /dev/null
person Paulo Moreira    schedule 06.08.2020