减小容器镜像的三板斧

# 两个 通过 && 把两个 <span style="color: #008080">RUN<span style="color: #000000"> 指令合并为一个,

这样只会创建一个镜像层,

从而减小最终镜像的尺寸

<span style="color: #008080">FROM<span style="color: #000000"> ubuntu
<span style="color: #008080">RUN apt-get update && apt-get install vim

》)来减小容器镜像的尺寸,并且还可以使用 multi-stage 技术结合不同的父镜像来极大的减小最终的镜像的尺寸。有没有很心动呢?接下来就让我们通过 demo 演示笔者砍掉镜像虚膘的三板斧!

const express = require('express'=app.get('/',(req,res) => res.send('Hello World!'<span style="color: #000000">))

app.listen(3000,() =><span style="color: #000000"> {
console.log(Example app listening on port </span>3000!<span style="color: #000000"&gt;)
})

{ "name": "hello-world","version": "1.0.0","main": "index.js","dependencies": { "express": "^4.16.2" },"scripts": { "start": "node index.js" } }

node:8

<span style="color: #008080">EXPOSE 3000
<span style="color: #008080">WORKDIR<span style="color: #000000"> /app
<span style="color: #008080">COPY<span style="color: #000000"> package.json index.js ./
<span style="color: #008080">RUN<span style="color: #000000"> npm install

<span style="color: #008080">CMD ["npm","start"]

$ docker build -t node--p : -ti -- --init node-demo

$ docker history node-demo

》):

node:8<span style="color: #008080">WORKDIR<span style="color: #000000"> /app
<span style="color: #008080">COPY<span style="color: #000000"> package.json index.js ./
<span style="color: #008080">RUN<span style="color: #000000"> npm install

<span style="color: #008080">FROM node:8

<span style="color: #008080">COPY<span style="color: #000000"> --from=build /app /
<span style="color: #008080">EXPOSE 3000
<span style="color: #008080">CMD ["npm","start"]

$ docker build --no-cache -t node-demo-multi . -f Dockerfile.multi

$ docker history node-demo-multi

$ docker images| node-demo

》。

node:8<span style="color: #008080">WORKDIR<span style="color: #000000"> /app
<span style="color: #008080">COPY<span style="color: #000000"> package.json index.js ./
<span style="color: #008080">RUN<span style="color: #000000"> npm install

<span style="color: #008080">FROM<span style="color: #000000"> gcr.io/distroless/nodejs

<span style="color: #008080">COPY<span style="color: #000000"> --from=build /app /
<span style="color: #008080">EXPOSE 3000
<span style="color: #008080">CMD ["index.js"]

$ docker build --no-cache -t node-demo- . -f Dockerfile.-p : -ti -- --init node-demo-

只有 76.7M!这确实太不可思议了,在吃惊之于让我们回归理性,看看 distroless 究竟是如何把镜像做的这么小?我想先用 docker exec 命令进入容器内部看看情况,结果是我无法用下面的命令进入到容器内部:

$ docker exec -it > bash

$ docker exec -it > node

》一文中的镜像大小)!

node:8<span style="color: #008080">WORKDIR<span style="color: #000000"> /app
<span style="color: #008080">COPY<span style="color: #000000"> package.json index.js ./
<span style="color: #008080">RUN<span style="color: #000000"> npm install

<span style="color: #008080">FROM node:8<span style="color: #000000">-alpine

<span style="color: #008080">COPY<span style="color: #000000"> --from=build /app /
<span style="color: #008080">EXPOSE 3000
<span style="color: #008080">CMD ["npm","start"]

$ docker build --no-cache -t node-demo-alpine . --p : -ti -- --init node-demo-alpine

只有 69.7M,比使用 distroless 项目创建的镜像还要小!能用 docker exec 命令进入容器吗?让我们运行一个命名的容器试试:

$ docker run -p : -d --name democon --init node-demo--it democon

相关文章

Docker是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...