Как запустить только одну вещь как root в докере - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь создать Dockerfile, который запускается от имени пользователя без полномочий root. При сборке все работает нормально, но nginx не может записать файл журнала, потому что у него недостаточно прав. Могу ли я при сборке Docker давать права root только для nginx?

Я пытаюсь использовать chmod, chown для заблокированных каталогов. Не работает

FROM php:7.1-fpm-alpine

RUN apk add --no-cache shadow

RUN apk add --no-cache --virtual .ext-deps \
        openssl \
        unzip \
        libjpeg-turbo-dev \
        libwebp-dev \
        libpng-dev \
        freetype-dev \
        libmcrypt-dev \
        imagemagick-dev \
        nodejs-npm \
        nginx \
        git \
        inkscape

# imagick
RUN apk add --update --no-cache autoconf g++ imagemagick-dev libtool make pcre-dev \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && apk del autoconf g++ libtool make pcre-dev

# Install Blackfire
RUN version=$(php -r "echo PHP_MAJOR_VERSION.PHP_MINOR_VERSION;") \
    && curl -A "Docker" -o /tmp/blackfire-probe.tar.gz -D - -L -s https://blackfire.io/api/v1/releases/probe/php/linux/amd64/$version \
    && tar zxpf /tmp/blackfire-probe.tar.gz -C /tmp \
    && mv /tmp/blackfire-*.so $(php -r "echo ini_get('extension_dir');")/blackfire.so \
    && printf "extension=blackfire.so\nblackfire.agent_socket=tcp://blackfire:8707\n" > $PHP_INI_DIR/conf.d/blackfire.ini

RUN apk add -y icu-dev \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl

RUN docker-php-ext-configure pdo_mysql && \
    docker-php-ext-configure opcache && \
    docker-php-ext-configure exif && \
    docker-php-ext-configure pdo && \
    docker-php-ext-configure zip && \
    docker-php-ext-configure gd \
    --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-webp-dir=/usr/include --with-freetype-dir=/usr/include && \
    docker-php-ext-configure sockets && \
    docker-php-ext-configure mcrypt

RUN docker-php-ext-install pdo zip pdo_mysql opcache exif gd sockets mcrypt && \
    docker-php-source delete

RUN ln -s /usr/bin/php7 /usr/bin/php && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
    mkdir -p /run/nginx

COPY ./init.sh /
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./.env /
RUN chmod +x /init.sh


EXPOSE 80

RUN addgroup -g 1001 node \
    && adduser -u 1001 -G node -s /bin/sh -D node

    ARG UID=1001
    ARG GID=1001
    ENV UID=${UID}
    ENV GID=${GID}

RUN usermod -u $UID node \
    && groupmod -g $GID node


RUN chown 1001:1001 /var/lib/nginx -R
RUN mkdir -p /var/tmp/nginx
RUN chown 1001:1001 /var/tmp/nginx -R

USER node

ENTRYPOINT [ "/init.sh" ]

Ответы [ 3 ]

0 голосов
/ 13 июня 2019

Я нашел решение.Я только что изменил RUN chown 1001:1001 /var/lib/nginx -R на RUN chown -R 1001:1001 /var/.Вот отлично работает

0 голосов
/ 18 июля 2019

RUN chown -R 1001:1001 /var/ иногда это будет действительно плохое решение.

вы можете попробовать добавить разрешения, подобные этому

RUN chown -R 1001:1001 /var/tmp/nginx RUN chown -R 1001:1001 /var/lib/nginx RUN chown -R 1001:1001 /var/log/nginx RUN chown -R 1001:1001 /run/nginx

Я думаю, RUN chown 1001:1001 /var/lib/nginx -R работает неправильно, потому что я установил флаг -R слишком поздно

0 голосов
/ 13 июня 2019

В вашем вопросе довольно много неизвестных, например, содержимое вашего default.conf файла. По умолчанию журналы nginx хранятся в /var/log/nginx, но я предполагаю, что вы переопределяете это в конфигурации.

Следующее, что основной процесс nginx должен запускаться от имени пользователя root, если вы не хотите, чтобы он мог связываться с системными портами (0 - 1023), поэтому в случае, если вы используете nginx в качестве веб-сервера и намереваясь использовать порты 80 и 443, вам следует придерживаться процесса nginx от имени root.

В случае, если вы планируете использовать другие порты и настроены на запуск главного процесса без полномочий root, вы можете проверить этот ответ, чтобы узнать, как это сделать - https://stackoverflow.com/a/42329561/5359953

Здесь я часто использую термин мастер-процесс, потому что nginx порождает рабочие процессы для обработки фактических запросов, и они могут запускаться от имени другого пользователя (определено в файле конфигурации nginx)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...