buildah进阶

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

学习本文要先大概了解dockerfile才行,部分基础命令会一带而过

我们昨天已经学习了buildah的安装和运行dockerfile,具体相关内容,可以翻看上一篇文章,今天我们来看看buildah的特性,大概会从以下2个方面来介绍buildah特性,第一个是buildah交互式构建镜像,第二个便是将容器的根目录挂载到宿主机上。 接着再介绍如何将制作好的镜像推送到私有仓库或则docker hub,最后再来讲一下如何删除镜像

buildah 交互式构建镜像

命令描述

介绍部分案例可能会用到的命令

buildah from

该命令是我们一般使用buildah from来基于镜像创建工作容器,我们尝试一下,基于centos创建工作容器,执行该命令后,会返回容器的名称,我们后面执行操作都将使用该容器名称

命令: buildah frm centos

我们查看buildah容器信息

命令: buildah containers

不仅如此,还可以以json信息输出,只需要添加--json即可

buildah config

该命令用于更新镜像配置,它包含很多子命令,我们分别来看

  • --cmd: 该命令用于设置容器启动的命令

语法: buildah config --cmd command containerID,其中 command 为执行的命令,containerID 为容器ID

  • --entrypoint:该命令用于基于镜像设置启动命令

语法: buildah config --entrypoint command containerID,其中command为执行的命令,containerID为容器ID

这里提及一下cmdentrypoint的区别

大概是这样的,cmd在启动容器是,会被替换掉,例如,我们使用buildah设置了buildah config --cmd ./redis-server containerID , 但是我们在run容器时候,使用了命令,例如: podman run -it redis /bin/bash,则 cmd命令会被替换为/bin/bash

entrypoint则不会,若run时指定了命令,它会附着在entrypoint后面,不会替换掉原有命令

  • --env: 该命令用于设置容器环境变量

语法: buildah config --env var=value containerID,其中var为变量名称,value为其值,containerID 为容器ID

  • --hostname: 该命令用于设置容器hostname

语法: buildah config --hostname domanhostname containerID, 其中domanhostnae为设置的主机名称

  • --port: 该命令用于设置容器开放的端口

语法: buildah config --port port containerID,其中port为要开放的端口

  • --workingdir设置容器工作目录

语法: buildah config --workingdir dir containerID,其中dir为新指定的工作目录

buildah copy

该命令用作拷贝文件进容器中

buildah add

该命令和buildah copy类似,不过add可以从网络上拷贝文件,若是压缩文件,还会自动解压

buildah run

该命令为容器执行命令,格式buildah run command containerID,其中command为容器中要执行的命令

buildah commit

从工作容器中创建镜像

使用buildah交互式构建镜像-栗子

执行命令

# 查看当前目录下文件
ls 
blogReader  Dockerfile  main.go
# 我们的目的是将blogReader拷贝进镜像中,并且制作为容器,现在我们开始吧
 
# 我们基于centos创建一个容器哈
buildah from centos

# 我们得到了该容器名称: centos-working-container-2
 
# 创建维护者信息
buildah config --label MAINTAINER="pdudo juejin buildah" centos-working-container-2

# 将blogReader可执行文件拷贝进容器中
buildah copy centos-working-container-2 blogReader ./blogReader 
 
# 赋予文件可执行权限
buildah run centos-working-container-2 chmod +x ./blogReader

# 将容器端口开放出去
buildah config --port 9091 centos-working-container-2

# 定义容器启动命令
buildah config --cmd ./blogReader centos-working-container-2

# 保持镜像到磁盘
buildah commit centos-working-container newblogreader

# 查看容器镜像
podman images | head -n 1; podman images | grep newblogreader

测试镜像

我们将刚刚制作的镜像运行起来,访问路由查看是否正常

将容器的根目录挂载到宿主机上

我们使用mountunount 来挂载和卸载目录,这个命令之前讲过,可以利用宿主机工具,在容器中操作具体命令,无需容器再构建工具,例如: targccmakego等,可以减少镜像的容量。

命令描述

buildah mount

使用buildah制作镜像时,若使用buildah mount能够将容器的根目录挂载到宿主机上,这个非常强大,能够向操作宿主机一样,操作容器文件。

例如: 我们启动一个centos容器,然后将该容器根目录挂载到宿主机上,我们尝试下

挂载命令: buildah mount containerID,其中containerID为容器ID

buildah umount

buildah mount相反,umount 是取消挂载的意思,我们一般在制作镜像时,若需要挂载,我们则将其挂载出来,处理完毕后,一定要记得umount回去哈,养成好的习惯。

使用buildah mount栗子

这次我们将源文件可执行文件都放在宿主机上,利用挂载,我们直接将宿主机文件编译并且放到容器中。

源文件

我们还是以上上天那个go程序作为栗子哈

脚本

我们将上述buildah命令整合为为脚本(要不要给shell脚本也挖一个坑,后面单独讲讲脚本?)应该是这样的

执行脚本查看过程

由于我们开启了“debug”,所以,我们执行脚本看下

我们查看一下镜像

测试镜像

我们将刚刚制作的镜像运行起来,访问路由查看是否正常

将制作好的镜像推送到镜像仓库

我们一般所谓的镜像仓库可以分为两大类,1. 私有仓库 2. 公共仓库

目前我们还没有私有仓库,所以我们直接推送到公用仓库,推送到共有仓库一般流程为,将容器打一个符合仓库的tag,然后将这个镜像推送到仓库即可。

命令描述

buildah login

我们一般使用buildah login登录仓库,然后再利用buildah push推送到远程仓库即可

例如我们想登录docker hub,则仅需要: buildah login docker.io即可

image.png

buildah logout

buildah logout则为退出登录,不多阐述

buildah pull

buildah pull为拉取远程镜像,我们尝试拉取一个redis下来看看

buildah push

buildah push则为上传镜像至远程仓库 image.png

删除镜像

删除镜像,我们一般使用podman rmi或则buildah rmi删除即可,例如我们删除nginxredis镜像

心得

我一开始并不怎么看好buildah交互式操作,直到遇到了buildah mount,试着写了一下,啊,真香,我写dockerfile不算少,或多或少被环境坑过一波,比如,我们想自己制作redis镜像,那么如果按照docker build的规则,则必须在容器中安装makegcc 等,徒增容器容量大小,后期又不会使用,很得不偿失,mount将目录挂出来,个人感觉撩到了我的G点了,真的很强,可以结合shell,来构建镜像,才会越来越得心应手。

posted @ 2022-04-10 22:13  pdudos  阅读(0)  评论(0编辑  收藏  举报  来源