【问题标题】:Docker- parent image for Node.js based ImagesDocker- 基于 Node.js 的图像的父图像
【发布时间】:2019-10-10 21:28:28
【问题描述】:
我正在尝试创建一个基于 Node.js 的 docker 映像。为此,我正在寻找Parent image 的选项。安全性是镜像中的主要考虑因素之一,我们希望通过不允许容器中的 shell 或 bash 来强化镜像。
Google Distroless 确实提供了此选项,但 Distroless-NodeJS 处于实验阶段,不建议用于生产。
我能想到的可能选项是(妥协 Distroless 功能):
话虽如此,
任何指针都会有所帮助。
【问题讨论】:
标签:
node.js
docker
dockerfile
【解决方案1】:
一种选择是从满足您要求的节点映像开始,然后删除您不想要的任何内容(sh、bash 等)
在极端情况下,您可以将以下内容添加到 Dockerfile:
RUN /bin/rm -R /bin/*
虽然我不确定这不会干扰节点的运行。
在官方节点图像(不包括 Apline)上,您有 /bin/bash、/bin/dash 和 /bin/sh(指向 /bin/dash 的符号链接)。只需删除这 3 只苍蝇就足以阻止 shell 访问。
Alpine 版本有一个符号链接/bin/sh -> /bin/busybox。您可以删除此符号链接,但如果没有busybox,它可能无法运行。
【解决方案2】:
我认为您可以从头开始构建仅包含您的节点应用程序和所需依赖项的映像,甚至没有 ls or pwd 等。
FROM node as builder
WORKDIR /app
COPY . ./
RUN npm install --prod
FROM astefanutti/scratch-node
COPY --from=builder /app /app
WORKDIR /app
ENTRYPOINT ["node", "bin/www"]
scratch-node
因此,如果有人试图获得外壳,例如,
docker run --entrypoint bash -it my_node_scratch
会报错
docker:来自守护进程的错误响应:OCI 运行时创建失败:
container_linux.go:348:启动容器进程导致“exec:
\"bash\": 在 $PATH" 中找不到可执行文件:未知。
【解决方案3】:
我指的是官方 Node.js docker 镜像。
在您的项目中创建一个 docker 文件。
然后构建并运行 docker 镜像:
docker build - t test-nodejs-app
docker run -it --rm --name running-app test-nodejs-app
如果你更喜欢 docker compose:
Version: "2"
Services:
node:
image: "node:8"
user: "node"
working_dir: /home/node/app
environment:
- NODE_ENV=production
volumes:
- ./:/home/node/app
expose:
- "8081"
command: "npm start"
运行撰写文件:
docker-compose up -d