在非特权容器错误中创建符号链接

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 拥有,所有人都可执行,并且只能由其所有者写入;您通常不希望应用程序能够覆盖自己的代码。