说它是个好消息,是因为如果攻击者利用你的应用程序获得对容器的访问权限将无法像访问shell那样造成太多破坏。换句话说,更少的二进制文件意味着更小的体积和更高的安全性,不过这是以痛苦的调试为代价的。
或许你不应在生产环境中attach和调试容器,而应该使用日志和监控。
但如果你确实需要调试,又想保持小体积该怎么办?
3. 小体积的Alpine基础镜像你可以使用Alpine基础镜像替换distroless基础镜像。
Alpine Linux是:
一个基于musl libc和busybox的面向安全的轻量级Linux发行版。
换句话说,它是一个体积更小也更安全的Linux发行版。
不过你不应该理所当然地认为他们声称的就一定是事实,让我们来看看它的镜像是否更小。
先修改Dockerfile,让它使用node:8-alpine:
FROM node:8 as build WORKDIR /app COPY package.json index.js ./ RUN npm install FROM node:8-alpine COPY --from=build /app / EXPOSE 3000 CMD ["npm", "start"]使用下面的命令构建镜像:
$ docker build -t node-alpine .现在可以检查一下镜像大小:
$ docker images | grep node-alpine node-alpine aa1f85f8e724 69.7MB69.7MB!
甚至比distrless镜像还小!
现在可以attach到正在运行的容器吗?让我们来试试。
让我们先启动容器:
$ docker run -p 3000:3000 -ti --rm --init node-alpine Example app listening on port 3000!你可以使用以下命令attach到运行中的容器:
$ docker exec -ti 9d8e97e307d7 bash OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"bash\": executable file not found in $PATH": unknown看来不行,但或许可以使用shell?
$ docker exec -ti 9d8e97e307d7 sh / #成功了!现在可以attach到正在运行的容器中了。
看起来很有希望,但还有一个问题。
Alpine基础镜像是基于muslc的——C语言的一个替代标准库,而大多数Linux发行版如Ubuntu、Debian和CentOS都是基于glibc的。这两个库应该实现相同的内核接口。
但它们的目的是不一样的:
glibc更常见,速度也更快;
muslc使用较少的空间,并侧重于安全性。
在编译应用程序时,大部分都是针对特定的libc进行编译的。如果你要将它们与另一个libc一起使用,则必须重新编译它们。
换句话说,基于Alpine基础镜像构建容器可能会导致非预期的行为,因为标准C库是不一样的。
你可能会注意到差异,特别是当你处理预编译的二进制文件(如Node.js C++扩展)时。
例如,PhantomJS的预构建包就不能在Alpine上运行。
你应该选择哪个基础镜像?你应该使用Alpine、distroless还是原始镜像?
如果你是在生产环境中运行容器,并且更关心安全性,那么可能distroless镜像更合适。
添加到Docker镜像的每个二进制文件都会给整个应用程序增加一定的风险。
只在容器中安装一个二进制文件可以降低总体风险。
例如,如果攻击者能够利用运行在distroless上的应用程序的漏洞,他们将无法在容器中使用shell,因为那里根本就没有shell!
请注意,OWASP本身就建议尽量减少攻击表面。
如果你只关心更小的镜像体积,那么可以考虑基于Alpine的镜像。
它们的体积非常小,但代价是兼容性较差。Alpine使用了略微不同的标准C库——muslc。你可能会时不时地遇到一些兼容性问题。
原始基础镜像非常适合用于测试和开发。
它虽然体积很大,但提供了与Ubuntu工作站一样的体验。此外,你还可以访问操作系统的所有二进制文件。
再回顾一下各个镜像的大小:
node:8 681MB
node:8 使用多阶段构建为678MB
gcr.io/distroless/nodejs 76.7MB
node:8-alpine 69.7MB
英文原文:https://itnext.io/3-simple-tricks-for-smaller-docker-images-f0d2bda17d1e
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx