我有这个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的活动性和冗余性探针在外部执行。
我该怎么做?文件夹重组或类似的东西对我来说很好。
在大多数情况下,你可能希望自己的代码为所拥有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