在非特权容器错误中创建符号链接
create a symlink in an unprivileged container error
我正在 运行 K8s 部署并试图加强我的一个 pod 的安全性,因此我开始使用以下 docker 图像:
nginxinc/nginx-unprivileged:高山
问题是我需要创建一个符号链接但无法完成。
这是我的docker文件
的结构
FROM nginxinc/nginx-unprivileged:alpine
ARG name
ARG ver
USER root
COPY ./outbox/${name}-${ver}.tgz ./
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./mime.types /etc/nginx/mime.types
COPY ./about.md ./
RUN mv /${name}-${ver}.tgz /usr/share/nginx/html
WORKDIR /usr/share/nginx/html
RUN tar -zxf ${name}-${ver}.tgz \
&& mv ngdist/* . \
&& mv /about.md ./assets \
&& rm -fr ngdist web-ui-${ver}.tgz \
&& mkdir -p /tmp/reports
RUN chown -R 1001 /usr/share/nginx/html/
COPY ./entrypoint.sh.${name} /bin/entrypoint.sh
RUN chown 1001 /bin/entrypoint.sh
USER 1001
EXPOSE 8080
CMD [ "/bin/entrypoint.sh" ]
这是我的 entrypoint.sh
#!/bin/sh
ln -s /tmp/reports /usr/share/nginx/html/reports
这是我在 pod 部署 yaml 文件中的容器
containers:
- name: web-ui
image: "myimage"
imagePullPolicy: Always
ports:
- containerPort: 8080
name: web-ui
volumeMounts:
- name: myvolume
mountPath: /tmp/reports
我试图在根执行下设置入口点,但这也无济于事,我得到的错误是:
Error: failed to start container "web-ui": Error response from daemon:
OCI runtime create failed: container_linux.go:380: starting container
process caused: exec: "/bin/entrypoint.sh": permission denied: unknown
像其他 Linux 命令一样,Docker 容器的主要 CMD
不能 运行 如果它命名的程序不可执行。
大多数 source-control 系统将跟踪文件是否可执行,并且 Docker COPY
将保留该权限位。所以解决这个问题的最好方法是让脚本在主机上可执行:
chmod +x entrypoint.sh.*
git add entrypoint.sh.*
git commit -m 'make entrypoint scripts executable'
docker-compose build
docker-compose up -d
如果这不是一个选项,您也可以在 Docker 文件中修复它。
COPY ./entrypoint.sh.${name} /bin/entrypoint.sh
RUN chmod 0755 /bin/entrypoint.sh
与 /bin
中的其他内容一样,该脚本通常应由 root 拥有,所有人都可执行,并且只能由其所有者写入;您通常不希望应用程序能够覆盖自己的代码。
我正在 运行 K8s 部署并试图加强我的一个 pod 的安全性,因此我开始使用以下 docker 图像:
nginxinc/nginx-unprivileged:高山
问题是我需要创建一个符号链接但无法完成。
这是我的docker文件
的结构FROM nginxinc/nginx-unprivileged:alpine
ARG name
ARG ver
USER root
COPY ./outbox/${name}-${ver}.tgz ./
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./mime.types /etc/nginx/mime.types
COPY ./about.md ./
RUN mv /${name}-${ver}.tgz /usr/share/nginx/html
WORKDIR /usr/share/nginx/html
RUN tar -zxf ${name}-${ver}.tgz \
&& mv ngdist/* . \
&& mv /about.md ./assets \
&& rm -fr ngdist web-ui-${ver}.tgz \
&& mkdir -p /tmp/reports
RUN chown -R 1001 /usr/share/nginx/html/
COPY ./entrypoint.sh.${name} /bin/entrypoint.sh
RUN chown 1001 /bin/entrypoint.sh
USER 1001
EXPOSE 8080
CMD [ "/bin/entrypoint.sh" ]
这是我的 entrypoint.sh
#!/bin/sh
ln -s /tmp/reports /usr/share/nginx/html/reports
这是我在 pod 部署 yaml 文件中的容器
containers:
- name: web-ui
image: "myimage"
imagePullPolicy: Always
ports:
- containerPort: 8080
name: web-ui
volumeMounts:
- name: myvolume
mountPath: /tmp/reports
我试图在根执行下设置入口点,但这也无济于事,我得到的错误是:
Error: failed to start container "web-ui": Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/bin/entrypoint.sh": permission denied: unknown
像其他 Linux 命令一样,Docker 容器的主要 CMD
不能 运行 如果它命名的程序不可执行。
大多数 source-control 系统将跟踪文件是否可执行,并且 Docker COPY
将保留该权限位。所以解决这个问题的最好方法是让脚本在主机上可执行:
chmod +x entrypoint.sh.*
git add entrypoint.sh.*
git commit -m 'make entrypoint scripts executable'
docker-compose build
docker-compose up -d
如果这不是一个选项,您也可以在 Docker 文件中修复它。
COPY ./entrypoint.sh.${name} /bin/entrypoint.sh
RUN chmod 0755 /bin/entrypoint.sh
与 /bin
中的其他内容一样,该脚本通常应由 root 拥有,所有人都可执行,并且只能由其所有者写入;您通常不希望应用程序能够覆盖自己的代码。