首页 > 解决方案 > 对 Dockerfile 中复制的文件设置不同的用户权限

问题描述

我有这个 Dockerfile 设置:

FROM node:14.5-buster-slim AS base
WORKDIR /app


FROM base AS production
ENV NODE_ENV=production

RUN chown -R node:node /app
RUN chmod 755 /app
USER node
... other copies
COPY ./scripts/startup-production.sh ./
COPY ./scripts/healthz.sh ./

CMD ["./startup-production.sh"]

我面临的问题是我无法执行./healthz.sh,因为它只能由node用户执行。当我注释掉这两个RUNUSER命令时,我可以很好地执行文件。node但出于安全原因,我只想对 执行可执行权限。

我需要./healthz.shKubernetes 的 liveness & rediness 探针可以在外部执行。

我怎样才能做到这一点?文件夹重组或类似的东西对我来说很好。

标签: dockerdockerfilefile-permissions

解决方案


在大多数情况下,您可能希望您的代码由 拥有root,但对全世界来说是可读的,并且对于脚本来说是全球可执行的。DockerfileCOPY指令将从主机系统复制具有其现有权限的文件(隐藏在末尾的项目符号列表中的是一个注释,即文件“与其元数据一起单独复制”)。所以解决这个问题的最简单方法是确保脚本在主机系统上具有正确的权限:

# mode 0755 is readable and executable by everyone but only writable by owner
chmod 0755 healthz.sh
git commit -am 'make healthz script executable'

然后你就COPY可以进去了,没有任何特殊的设置。

# Do not RUN chown or chmod; just
WORKDIR /app
COPY ./scripts/healthz.sh .

# Then when launching the container, specify
USER node
CMD ["./startup-production.sh"]

您应该能够通过运行容器并手动调用运行状况检查脚本来在本地验证这一点

docker run -d --name app the-image
# possibly with a `docker exec -u` option to specify a different user
docker exec app /app/healthz.sh && echo OK

要检查的重要一点是该文件是全局可执行的。您还可以通过查看构建的容器来仔细检查

docker run --rm the-image ls -l /app/healthz.sh

那应该打印出一行,以权限字符串开头-rwxr-xr-x;最后三个r-x是重要的部分。如果您无法通过其他方式获得权限,您也可以在映像构建中修复它们

COPY ./scripts/healthz.sh .
# If you can't make the permissions on the original file right:
RUN chmod 0755 *.sh

推荐阅读