docker - 对 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
用户执行。当我注释掉这两个RUN
和USER
命令时,我可以很好地执行文件。node
但出于安全原因,我只想对 执行可执行权限。
我需要./healthz.sh
Kubernetes 的 liveness & rediness 探针可以在外部执行。
我怎样才能做到这一点?文件夹重组或类似的东西对我来说很好。
解决方案
在大多数情况下,您可能希望您的代码由 拥有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
推荐阅读
- python-3.x - Python 3:两个具有共同 __init_subclass__() 的类
- android - 如何修复尝试进行查询时抛出的 SQLiteException?
- r - 子设置向量内的元素块
- python - 如何将数据框的列标题复制到每一行值?
- python - celery:打印以 apply_async 开始的组中每个任务的状态
- php - $_GET 不返回值的 Wordpress 插件问题
- scala - Spark 数据集类型注释支持
- python - 使用 pandas 将字符串替换为自身的较短版本
- oop - python 的 __repr__ 和 __str__ 的球拍等价物?
- python - UDP广播后监听哪个端口?