如何在Docker中以root身份运行仅一件事

时间:2019-06-12 17:00:23

标签: symfony docker

我正在尝试创建一个以非root用户身份运行的Dockerfile。 当我构建此文件时,一切正常,但是nginx无法写入日志文件,因为它没有足够的权限。我可以在构建Docker时仅为nginx授予root权限吗?

我正在尝试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 :(得分:0)

您的问题中有很多未知数,例如default.conf文件的内容。默认情况下,nginx日志存储在/var/log/nginx中,但是我假设您在配置中将其覆盖。

接下来的事情是,如果您不希望nginx的主进程能够绑定到系统端口(0-1023),则需要以root身份运行它,因此如果您将nginx用作Web服务器并且打算使用端口80和443,则应该以root用户身份运行nginx进程。

如果您打算使用其他端口并且设置了以非root用户身份运行主进程的想法,那么可以查看此答案以获取有关如何执行此操作的建议-https://stackoverflow.com/a/42329561/5359953

我在这里经常使用术语“主进程”,因为nginx会生成工作进程来处理实际请求,并且这些请求可以作为其他用户运行(在nginx配置文件中定义)

答案 1 :(得分:0)

我找到了解决方案。我刚刚将RUN chown 1001:1001 /var/lib/nginx -R更改为RUN chown -R 1001:1001 /var/。没问题

答案 2 :(得分:0)

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设置得太晚了