6

我无法从入口点脚本将用户切换到非 root 用户。在 Dockerfile 中更改用户的用户指令有效,但我无法使用 chmod 更改权限。为了克服这个问题,我创建了entrypoint.sh脚本来更改文件夹权限,但是当我尝试使用su命令切换用户时,它显然不起作用,容器仍然以 root 身份运行。

Dockerfile

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

入口点.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 用户身份运行容器。

4

2 回答 2

1

要解决这个问题,您需要更改 dockerfile 并添加:

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
于 2020-08-06T15:38:56.450 回答
1

我认为您的 su 命令应该类似于

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

b / c你的entrpoiny脚本正在切换用户,什么都不做,然后切换回root。

于 2018-10-15T12:53:45.763 回答