Docker镜像构建
目录
1. 基于已有docker镜像,通过dockerfile构建一个新的镜像
1. 基于已有docker镜像,通过dockerfile构建一个新的镜像
可以基于已有的docker镜像,构建新的镜像,并在构建时就安装好需要的包。当然也可以先构建一个镜像,在镜像里安装需要的包,再导出。
比如,下面基于本地的x5:v1.0的镜像,构建x5:v2.0的新镜像。这种方法通过dockerfile构建一个新的镜像。
# Dockerfile.add-tools
FROM x5:v1.0
RUN apt-get update && apt-get install -y \
python3-empy \
python3-catkin-pkg \
python3-rospkg \
&& rm -rf /var/lib/apt/lists/*
# 将 tools 文件夹复制到 Docker 中
COPY tools/ /opt/tools/
# 设置环境变量
ENV TOOLS_ROOT=/opt/tools
ENV PATH=/opt/tools/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
ENV LD_LIBRARY_PATH=/opt/tools/opencv/install/root/usr/lib:$LD_LIBRARY_PATH
# 验证安装
RUN echo "Tools installed at: /opt/tools" && \
ls -la /opt/tools/
但是要特别注意的是,FROM x5:v1.0 意味着新构建的镜像是依赖x5:v1.0这个旧镜像的。如果在构建完成之后想要删除旧镜像,是无法做到的,这涉及到docker的一些机理。新镜像并不是“拷贝”父镜像的文件,而是直接引用父镜像的所有层,并在其上添加新层。这种设计极大地节省了磁盘空间,也加快了构建速度。
运行这个文件
docker build -f Dockerfile.add-tools -t x5:v2.0 .
就可以构建出一个新的docker镜像了。注意由于是docker build构建的,就意味着是在旧镜像的原有蹭上添加新层,最终生成一个多层的镜像。
2. 导出新镜像
如果仍然想要删除旧镜像,或者本身就想备份新的镜像,就涉及到镜像的导出。这里有两种方法。可以通过docker save 和docker export。
docker save是对镜像的操作,会保存完整的镜像层历史和元数据。对应docker load 加载。
docker export是对容器的操作,是对当前容器的文件系统快照,没有历史层。对应docker import加载。如果镜像有历史层损害,可以通过这种方法抢救文件。然后再制作成一个新的只有一层的新镜像。
3. docker 多层机制
docker的分层的镜像结构是其设计的核心优势之一。
首先可以回滚,通过docker history可以产看完整的构建过程。如果某次变更导致问题,可以回退。如果都压平,就无法回退了。
另外通过基础镜像构建新镜像可以构建多个新镜像,基础层不会被重复存储,而是直接引用。如果某层及其上层没有变更,就会直接使用缓存。这样构建镜像的速度也更快。
在使用docker push 和docker pull的时候,也仅传入变化的层。这也有点像git。方便对docker镜像进行管理。
更多推荐



所有评论(0)