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
这里提及一下cmd
和entrypoint
的区别
大概是这样的,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
测试镜像
我们将刚刚制作的镜像运行起来,访问路由查看是否正常
将容器的根目录挂载到宿主机上
我们使用mount
和unount
来挂载和卸载目录,这个命令之前讲过,可以利用宿主机工具,在容器中操作具体命令,无需容器再构建工具,例如: tar
、gcc
、make
、go
等,可以减少镜像的容量。
命令描述
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
即可
buildah logout
buildah logout
则为退出登录,不多阐述
buildah pull
buildah pull
为拉取远程镜像,我们尝试拉取一个redis
下来看看
buildah push
buildah push
则为上传镜像至远程仓库
删除镜像
删除镜像,我们一般使用podman rmi
或则buildah rmi
删除即可,例如我们删除nginx
和redis
镜像
心得
我一开始并不怎么看好buildah
交互式操作,直到遇到了buildah mount
,试着写了一下,啊,真香,我写dockerfile
不算少,或多或少被环境坑过一波,比如,我们想自己制作redis
镜像,那么如果按照docker build
的规则,则必须在容器中安装make
、gcc
等,徒增容器容量大小,后期又不会使用,很得不偿失,mount
将目录挂出来,个人感觉撩到了我的G点了,真的很强,可以结合shell
,来构建镜像,才会越来越得心应手。