Dockerfile chown 正在被覆盖

问题描述

我正在执行 NginxPHP-fpm 的客户 dockerfile 中安装 newrelic PHP 代理。 运行的 dwefault 用户和组是 www-data

我正在为 newrelic 创建日志目录并 chowning 到 www-data,但是当容器启动时所有者仍然是 root 如果我 ls -l /var/log/newrelic 这会导致 newrelic 无法工作

请记住,我稍后不会在 docker-compose 中安装任何卷,因此 /var/log/newrelic 不会被任何内容覆盖。

因此在使用以下 dockerfile 构建图像后的当前状态,然后创建容器,在内部使用 shell 并检查统计结果是错误的:

/var/www/html/app # ls -l /var/log/newrelic/
total 8
-rw-r--r--    1 root     root           215 Jul 19 16:35 newrelic-daemon.log
-rw-r--r--    1 root     root          1081 Jul 19 16:35 PHP_agent.log

应该是用户和组的 www-data 而不是 root

我的 Dockerfile:

FROM kristijorgji/PHP-fpm-8-Nginx:0.0.3 as base

FROM base as builder

# we are not installing js or PHP dependencies here as those shoud have been done before in prevIoUs scripts
# just copying files

copY . /var/www/html/app/

FROM base as production

ARG BUILD_ENV
ARG NEWRELIC_LICENCE
ARG NEWRELIC_PROJECT_NAME=w-${BUILD_ENV}

RUN test -n "$BUILD_ENV" || (echo "BUILD_ENV  not set" && false)

# have to switch to root user temporary as newrelic install script runs only as root
USER root
# Install newrelic agent
RUN nr_version=newrelic-PHP5-9.17.1.301-linux-musl \
    && curl -o ${nr_version}.tar.gz https://download.newrelic.com/PHP_agent/release/${nr_version}.tar.gz \
    && gzip -dc ${nr_version}.tar.gz | tar xf - \
    && cd ${nr_version} \
    && NR_INSTALL_SILENT=1 ./newrelic-install install
RUN nr_logs=/var/log/newrelic && mkdir -p "$nr_logs" && chown -R www-data.www-data "$nr_logs"
copY ./docker-data /docker-data
# setup the licence
RUN nrinipath=$(PHP -r "echo(PHP_CONfig_FILE_SCAN_DIR);")/newrelic.ini \
    && cp /docker-data/newrelic.ini $nrinipath \
    && sed -i -e "s/REPLACE_WITH_REAL_KEY/${NEWRELIC_LICENCE}/" \
    -e "s/REPLACE_WITH_REAL_APP_NAME/${NEWRELIC_PROJECT_NAME}/" \
    $nrinipath
USER www-data

copY --from=builder --chown=www-data /var/www/html/app/ /var/www/html/app/
workdir /var/www/html/app/

如果你想检查基础镜像的 dockerfile kristijorgji/PHP-fpm-8-Nginx:0.0.3 这里是文件https://github.com/kristijorgji/docker-images/blob/main/php-fpm-8-nginx/Dockerfile

重现问题的步骤非常简单: 首先创建一个文件夹并复制给定的 dockerfile 然后构建镜像并运行一个容器来检查文件夹权限

  1. 构建映像 docker build --build-arg BUILD_ENV=production \ --build-arg NEWRELIC_LICENCE=doesntmatter \ -t mytag .
  2. 从图像创建容器以检查文件docker run --rm -it -u root --entrypoint='' /bin/sh mytag
  3. 在容器内运行 ls -l /var/log/newrelic 并会看到 root:root 是所有者而不是 www-data:www-data

附注: 这里的解决方案是将 /var/log/newrelic 的所有权更改为 www-data,如果我在实时执行容器 newrelic 代理工作中执行此操作,但我想自动执行此操作,因此自 dockerfile 以来,日志文件夹将使用正确的权限进行预备份

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)