buildah进阶

简介: buildah进阶

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


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



buildah 交互式构建镜像


命令描述

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


buildah from

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

命令: buildah frm centos

image.png


我们查看buildah容器信息

命令: buildah containers

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

image.png


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


image.png



测试镜像

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

image.png



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


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


命令描述


buildah mount


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


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

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


image.png


buildah umount

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

image.png


使用buildah mount栗子

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


源文件

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

image.png

脚本

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

image.png


执行脚本查看过程

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

image.png


我们查看一下镜像

image.png


测试镜像

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

image.png




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

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

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



命令描述


buildah login

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

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

image.png


buildah logout

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

image.png


buildah pull

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

image.png


buildah push

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

image.png



删除镜像

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

image.png

image.png




心得


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




相关文章
|
1月前
|
人工智能 安全 数据安全/隐私保护
OpenClaw(Clawdbot)汉化版完整搭建指南 全平台安装+附阿里云上部署教程
在AI工具爆发的2026年,OpenClaw(曾用名Clawd、Moltbot)以黑马之姿崛起——一周内GitHub Stars从7800飙升至12万+,成为历史上增长最快的开源项目之一。这款由PSPDFKit创始人Peter Steinberger打造的通用AI助手,打破了普通聊天机器人的功能局限,能真正执行系统控制、浏览器自动化、邮件管理等实用任务。但原版全英文界面对中文用户不够友好,第三方团队推出的汉化版完美解决这一痛点,实现命令行与网页控制台的全中文适配,让国内用户轻松上手。
5088 13
|
人工智能 JavaScript Java
从零开始教你打造一个MCP客户端
Anthropic开源了一套MCP协议,它为连接AI系统与数据源提供了一个通用的、开放的标准,用单一协议取代了碎片化的集成方式。本文教你从零打造一个MCP客户端。
7126 5
|
6月前
|
人工智能 运维 安全
阿里云函数计算 AgentRun 全新发布,构筑智能体时代的基础设施
云原生应用平台 Serverless 计算负责人杨皓然在云栖大会发表主题演讲“Serverless Agent 基础设施:助力大规模 Agent 部署与运维”。本议题深入介绍了阿里云以函数计算为核心打造的 Agent 基础设施——AgentRun,阐述其如何通过创新的运行时、模型服务、网关及可观测体系,为企业构筑坚实、高效、安全的 Agent 时代基石。
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
9月前
|
弹性计算 JavaScript Ubuntu
WebSocket协议相关的测试命令工具使用简介
本文介绍了针对WebSocket的测试工具wscat和websocat的基本使用方法,以及通过curl命令测试HTTP/HTTPS协议的方式。对于WebSocket,直接使用curl测试较为复杂,推荐使用wscat或websocat。文中详细说明了这两种工具的安装步骤、常用参数及连接示例,例如在ECS上开启8080端口监听并进行消息收发测试。此外,还提供了curl命令的手动设置头部信息以模拟WebSocket握手的示例,但指出curl仅能作为客户端测试工具,无法模拟服务器。
2918 4
|
Java Maven
idea构建grpc项目
idea构建grpc项目
516 1
|
存储 安全 Linux
Podman入门全指南:安装、配置与运行容器
Podman入门全指南:安装、配置与运行容器
10954 1
Qwen2.5-Coder: 码无止境,学无止境!
Qwen2.5-Coder: 码无止境,学无止境!
|
Kubernetes 安全 调度
深度解读:阿里云全球首发的容器计算服务 ACS 诞生背景、核心技术与应用场景
深度解读:阿里云全球首发的容器计算服务 ACS 诞生背景、核心技术与应用场景
70544 45
|
存储 异构计算 索引
GGML 非官方中文文档(3)
GGML 非官方中文文档
529 0