我正在尝试创建一个以非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" ]
答案 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
设置得太晚了