首页 > 其他分享 >9、Docker 多级构建

9、Docker 多级构建

时间:2023-03-19 22:55:06浏览次数:35  
标签:cache RUN app 多级 href 构建 go 镜像 Docker

Docker image Build 高级

镜像 Cache 机制

Docker Daemnon 通过 Dockerfile 构建镜像时,当发现即将新构建出的镜像与已有的某镜像重复时,可以选择放弃构建新的镜像,而是选用已有的镜像作为构建结果,也就是采取本地已经 cache 的镜像作为结果

Cache 机制的注意事项:

1. ADD 命令与 COPY 命令:Dockerfile 没有发生任何改变,但是命令ADD run.sh / 中 Dockerfile 当前目录下的 run.sh 却发生了变化,从而将直接导致镜像层文件系统内容的更新,原则上不应该再使用 cache。那么,判断 ADD 命令或者 COPY 命令后紧接的文件是否发生变化,则成为是否延用 cache 的重要依据。Docker 采取的策略是:获取 Dockerfile 下内容(包括文件的部分 inode 信息),计算出一个唯一的 hash 值,若 hash 值未发生变化,则可以认为文件内容没有发生变化,可以使用 cache 机制;反之亦然**

2. RUN 命令存在外部依赖:一旦 RUN 命令存在外部依赖,如RUN apt-get update,那么随着时间的推移,基于同一个基础镜像,一年的 apt-get update 和一年后的 apt-get update, 由于软件源软件的更新,从而导致产生的镜像理论上应该不同。如果继续使用 cache 机制,将存在不满足用户需求的情况。Docker 一开始的设计既考虑了外部依赖的问题,用户可以使用参数 --no-cache 确保获取最新的外部依赖,命令为docker build --no-cache -t="my_new_image" .

3. 树状的镜像关系决定了,一次新镜像的成功构建将导致后续的 cache 机制全部失效:这一点很好理解,一旦产生一个新的镜像,同时意味着产生一个新的镜像 ID,而当前宿主机环境中肯定不会存在一个镜像,此镜像 ID 的父镜像 ID 是新产生镜像的ID。这也是为什么,书写 Dockerfile 时,应该将更多静态的安装、配置命令尽可能地放在 Dockerfile 的较前位置

传统 Build 流程

FROM golang:1.7.3
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY app .
CMD ["./app"] 
#!/bin/sh
echo Building sparkdevo/href-counter:build
# 构建编译应用程序的镜像
docker build --no-cache -t sparkdevo/href-counter:build . -f Dockerfile.build
# 创建应用程序
docker create --name extract sparkdevo/href-counter:build
# 拷贝编译好的应用程序
docker cp extract:/go/src/github.com/sparkdevo/href-counter/app ./app
docker rm -f extract

echo Building sparkdevo/href-counter:latest
# 构建运行应用程序的镜像
docker build --no-cache -t sparkdevo/href-counter:latest .

aa

# 下载使用的代码
$ git clone https://github.com/wangyanglinux/href-counter.git

Dockerfile 中 multi-stage

FROM golang:1.7.3
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/sparkdevo/href-counter/app .
CMD ["./app"]

命名方式的 stage

FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/sparkdevo/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/sparkdevo/href-counter/app .
CMD ["./app"]

Google 内部精简镜像

$ git clone https://github.com/GoogleContainerTools/distroless

标签:cache,RUN,app,多级,href,构建,go,镜像,Docker
From: https://www.cnblogs.com/jiutang001/p/17234707.html

相关文章

  • docker网络-Namespace
    Namespace-网络netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境,目前netns在lxc容器中被用来为容器提供网络......
  • 浅谈云原生基础入坑与docker 搭建redis-cluster集群
    浅谈云原生基础入坑与docker搭建redis-cluster集群开篇来点自己的小感触:自从走上后端开发这条无法回头的互卷道路以后,在视野内可见新的技术在迭代,更新的技术在不断发行。......
  • 简单明了的体会构建者模式
    我们由一个小小的Demo来引出主题,尽管这个Demo有点长~~,我相信还是值得你一看的!木兰诗中有:“雄兔脚扑朔,雌兔眼迷离;双兔傍地走,安能辨我是雌雄?”对象之间的比较想必大家都很熟......
  • 使用Docker安装并启动MySQL
    1.在Docker镜像仓库查找MySQL镜像dockerhub镜像仓库或者通过命令dockersearchmysql在宿主机终端查找2.拉取MySQL镜像#拉取MySQL镜像dockerpull......
  • docker 命令下
    1.docker官网和的基础的2.一个一个的docker演示一下的启动:官方dockfile的启动下的启动一个Nginx启动,试一下的;做了cmd执行了,宿主机12345680 dockerrun-tio-p......
  • docker 容器内 安装nginx ./configure 编译出错问题
    ./configure:error:Ccompilerccisnotfound解决办法aptinstallg++./configure:error:theHTTPrewritemodulerequiresthePCRElibrary.解决办法......
  • 修改的方法 docker 命令上传
    创建目录执行,keep下的文件,连接不到集群里面的,复制到操作我们的集群,没有启动Keepalive并不一定是服务器的节点,找到一个节点之后访问到集群,boostarp创建一下,创建完成后,版......
  • 私有云docker
    `BaseEnvironmentAZStackEnterpriseManagementNode#企业的管理节点#管理节点会自带存储节点和计算节点AllowsthesystemtoactasaZStackenterpriseman......
  • 构建之法阅读笔记01
    ①重要的单元测试:有效解决程序员对模块功能的误解、疏忽或不了解模块的变化之类的问题,使自己负责的模块功能定义尽量明确,模块的质量得到稳定的、量化的保证。②好的单元测......
  • Docker的常规知识准备
    什么是dockerdocker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后......