站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#81
python3 开发 / python sort 和sorted 区别
上次发布者 jvip_chen - 2022-4月-13 09:39 上午
sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

1.字典根据键从小到大排序
dict = {"name": "zs", "age": 18, "city": "深圳", "tel": "1362626627"}

res = sorted(dict.items(), key=lambda x: x[0], reverse=False)

print(res)
new_dict = {}
for x in res:
    new_dict[x[0]] = x[1]

print(new_dict)
2. 字典排序方式二
foo = [{"name": "zs", "age": 19}, {"name": "ll", "age": 54},

       {"name": "wa", "age": 17}, {"name": "df", "age": 23}]

# 列表嵌套字典的排序,分别根据年龄和姓名排序
res = sorted(foo, key=lambda x: x["name"], reverse=False)

print(res)
3.元组排序

foo = [("zs", 19), ("ab", 2), ("t", 8)]
res = sorted(foo, key=lambda x: x[0], reverse=False)
print(res)
#82
python3 开发 / SQLAlchemy快速更新或插入对象
上次发布者 jvip_chen - 2022-4月-10 08:29 下午
写脚本刷数据的时候,常常有这样的需求:如果对象存在,那么更新数据,否则,插入数据。 有可能数据源的数据比schema的字段更多,这种时候,就需要想办法把SQLAlchemy中的schema字段取出来, 只取需要的字段了。假设我们的schema叫做 User:

valid_columns = set(User.__table__.columns.keys())  # 获取model中定义的columns
这样就能获取到合法的schema字段,然后我们把数据源的数据过滤:

valid_attrs = {k: v for k, v in i.items() if k in valid_columns}
如果其中有需要单独处理的字段,我们进行特殊处理:

adjust_time(valid_attrs)


def adjust_time(attrs):
    # mongo存储的是毫秒时间戳
    attrs["created_at"] = datetime.datetime.fromtimestamp(attrs["created_at"] / 1000.0)
    attrs["updated_at"] = datetime.datetime.fromtimestamp(attrs["updated_at"] / 1000.0)
    if attrs.get("deleted_at"):
        attrs["deleted_at"] = datetime.datetime.fromtimestamp(attrs["deleted_at"] / 1000.0)
之后我们就可以愉快的对SQLAlchemy对象进行更新或者插入了:

already_exist = User.get_by_id(s, i["user_id"])
if already_exist:
    logging.info("update item: %s", i)
    User.update_by_user_id(s, already_exist.user_id, valid_attrs)
else:
    logging.info("insert item: %s", i)
    s.add(User(**valid_attrs))
其中,model中的 update_by_user_id定义如下:

@classmethod
def update_by_user_id(cls, session, user_id, attr_map):
    session.query(cls).filter(cls.user_id == user_id).update(attr_map)
搞定!
#83
python3 开发 / sqlalchemy更新和插入操作
上次发布者 jvip_chen - 2022-4月-10 08:28 下午
def save_app_info(self):
        try:
            # update app_info
            print(self.dicts)
            data = db_session.query(App_Info).filter_by(app_id=self.app_id,mall_name=self.mall_name).first()
            if data:   
                {setattr(data, k, v) for k,v in dicts.items()}
                print(data)
            else:
                # insert app_info
                db_session.execute(App_Info.__table__.insert(), self.dicts)
            db_session.commit()
        except:
            db_session.rollback()
            other.error("save app_data is error,here are details:{}".format(traceback.format_exc()))
        finally:
            db_session.close()
#84
python3 开发 / SQLAlchemy insert 和 update
上次发布者 jvip_chen - 2022-4月-10 08:25 下午
在SQLAlchemy,update和insert的写法很像,但是又有区别,下面看看代码:

insert操作代码:

msg_count = db.session.query(sqlalchemy.func.count(SMS_Receive.id))\
            .filter(and_(SMS_Receive.IsShow == True, SMS_Receive.PhoneNumber_id == number))\
            .scalar()
sms_count_info = SMSCount(PhoneNumber_id=number, SMS_Count=msg_count)
db.session.add(sms_count_info)
db.session.commit()
之后是update代码:

get_sms_count = SMSCount.query.filter_by(PhoneNumber_id=number).first()
get_sms_count.SMS_Count+=1
get_sms_count.PhoneNumber_id=number
db.session.commit()
可以看到在insert里面先加入到session里面才提交,而insert则是先查询出来之后更新才提交。

看看stack overflow上面的update一些回答写法:

admin = User.query.filter_by(username='admin').first()
admin.email = 'my_new_email@example.com'
db.session.commit()

user = User.query.get(5)
user.name = 'New Name'
db.session.commit()
#85
CentOs / CentOS8解决“Failed to download m...
上次发布者 jvip_chen - 2022-1月-28 05:37 下午
在CentOS8上执行下面命令时报错

yum install epel-release
CentOS Linux 8 - AppStream                       23  B/s |  38  B     00:01   
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

原因
在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。

CentOS 8已于2021年12月31日寿终正寝,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org

解决方法�
如果你仍然需要运行你的旧CentOS 8,你可以在/etc/yum.repos中更新repos.d使用vault.centos.org代替mirror.centos.org。

cd /etc/yum.repos.d
vi CentOS-Linux-BaseOS.repo
vi CentOS-Linux-AppStream.repo
[baseos]
name=CentOS Linux $releasever - BaseOS
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[appstream]
name=CentOS Linux $releasever - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
#86
Tracker 是 Linux 的文件索引和搜索工具。 Gnome 将其用于某些功能,因此,默认情况下,Tracker 安装在许多 Linux 发行版上。

该工具可加快搜索速度并在"文件"应用程序中启用全文搜索,使基于元数据的批量重命名功能在"文件"应用程序中工作,并在"活动概览"中启用文件和文件夹搜索。 有一些 GNOME 应用程序也依赖于它(没有它就不能工作),比如音乐或照片。
如果没有 Tracker,您将失去这些功能,因此在完全禁用 Tracker 之前要考虑到这一点。

虽然它为 GNOME 桌面带来了许多有用的功能,但在某些情况下,Tracker 也会对性能产生影响。 这些性能问题据称已得到修复,现在甚至在 Ubuntu 19.04、19.10 和 20.04 中默认安装了 Tracker(在旧版本中默认不安装,例如 Ubuntu 18.04)。 但是仍然有用户遇到 Tracker 的性能问题,或者用户认为它过于占用资源。

那些不想使用Tracker的人在大多数情况下无法删除该应用程序,因为其他包依赖于它
. 这是来自 Ubuntu 19.04 的示例:

$ sudo apt remove tracker tracker-extract tracker-miner-fs

Reading package lists... Done
Building dependency tree     
Reading state information... Done
The following packages were automatically installed and are no longer required:
  gir1.2-clutter-gst-3.0 gir1.2-evince-3.0 libgsf-1-114 libgsf-1-common libmusicbrainz5-2
  libtagc0
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  gnome-shell-extension-desktop-icons gnome-sushi insync-nautilus nautilus
  nautilus-mediainfo nautilus-share tracker tracker-extract tracker-miner-fs ubuntu-desktop
  ubuntu-desktop-minimal
0 upgraded, 0 newly installed, 11 to remove and 0 not upgraded.
After this operation, 5,517 kB disk space will be freed.
Do you want to continue? [Y/n]
因此,尝试在 Ubuntu 19.04 上删除 Tracker 会导致 Nautilus、桌面图标扩展和 ubuntu-desktop 元包被删除。 在 Fedora 另一方面,默认安装了更多的 Gnome 软件,删除 Tracker 也想删除 Gnome Boxes、Documents、Photos 和 Totem,以及其他 134 个包。

在 Gnome 桌面上禁用 Tracker 的官方方法是去 Settings -> Search,然后从搜索设置标题栏(窗口顶部)关闭开关。 然而,有用户声称这不会禁用它
,所以我决定尝试一下,在关闭此选项并重新启动系统后,
tracker status
声称它的索引中有超过 100000 个文件,并且它目前正在索引文件。 但是如果您愿意,您可以尝试一下,看看它是否对您的系统有任何影响。

我已经用禁用(和撤销更改)Tracker 3 的说明更新了这篇文章,它是随 GNOME 3.38 一起发布的。 请注意,并非所有使用 GNOME 3.38 和更新版本的 Linux 发行版都使用 Tracker 3 – 例如 Ubuntu 20.10 和 21.04 都使用 GNOME 3.38 但使用 Tracker 2; Fedora 例如 34,使用 GNOME 40 和 Tracker 3。

那么如何完全禁用 Tracker,使其不再索引任何文件,并停止在后台运行任何 Tracker 进程? 您可以使用以下命令屏蔽 Tracker systemd 服务以完全为当前用户禁用它:

对于跟踪器 2:
systemctl --user mask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
对于追踪器 3:
systemctl --user mask tracker-extract-3.service tracker-miner-fs-3.service tracker-miner-rss-3.service tracker-writeback-3.service tracker-xdg-portal-3.service tracker-miner-fs-control-3.service
在此之后,重置跟踪器:

对于跟踪器 2:
tracker reset --hard
对于追踪器 3:
tracker3 reset -s -r
并重新启动。

如果您在屏蔽 Tracker 服务后重新启动系统,您应该不会再看到任何在后台运行的 Tracker 进程。 或者跑 tracker status (对于Tracker3,运行 tracker3 status) 并且它不应该工作,说该单元被屏蔽(这仅在您同时使用屏蔽和跟踪器重置命令时才会发生)。 你也可以运行 tracker daemon (对于跟踪器 3,运行 tracker3 daemon) 检查 Tracker 守护进程(Tracker Store 和 Tracker Miners)的状态——它们都应该被列为禁用/未运行:


您可能会收到一条警告,指出其中一些服务不存在 – 忽略它。 那是因为例如在 Ubuntu 19.04 上没有 tracker-miner-rss.service 默认情况下,但在 Solus OS 上有一个 Fedora,这反过来又没有 tracker-miner-apps.service.

当屏蔽一个 systemd 服务时,它的单元文件被符号链接到 /dev/null,即使其他服务尝试加载它,也无法加载该服务。 这比禁用服务要好,因为禁用后,如果启动了另一个依赖于它的服务,该服务可能仍会启动。

想要撤消此更改并重新启用 Tracker? 利用:

对于跟踪器 2:
systemctl --user unmask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
对于追踪器 3:
systemctl --user unmask tracker-extract-3.service tracker-miner-fs-3.service tracker-miner-rss-3.service tracker-writeback-3.service tracker-xdg-portal-3.service tracker-miner-fs-control-3.service
并在此之后重新启动您的系统.
#87
Linux 系统 / Linux crontab 命令
上次发布者 jvip_chen - 2022-1月-15 09:07 上午
Linux crontab是用来定期执行程序的命令。

当安装完成操作系统之后,默认便会启动此任务调度命令。

crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。

而 linux 任务调度的工作主要分为以下两类:

1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
语法
crontab [ -u user ] file

crontab [ -u user ] { -l | -r | -e }
说明:

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数说明:

-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表
时间格式如下:

f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12)
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。

实例
每一分钟执行一次 /bin/ls:
* * * * * /bin/ls
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup:
0 6-12/3 * 12 * /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name:
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha":
20 0-23/2 * * * echo "haha"
下面再看看几个具体的例子:
0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache
50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务
0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令
注意:当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,若是你不希望收到这样的邮件,请在每一行空一格之后加上 > /dev/null 2>&1 即可,如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh > /dev/null 2>&1
脚本无法执行问题
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。

解决方法:

1、所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
2、在 shell 脚本开头使用以下代码:
#!/bin/sh

. /etc/profile
. ~/.bash_profile
3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:
20 03 * * * . /etc/profile;/bin/sh /var/www/runoob/test.sh
#88
Podman / docker介绍及podman使用命令
上次发布者 jvip_chen - 2022-1月-14 12:07 下午
Docker

    开源应用容器引擎,go语言
    作用:打包应用到一个容器,随时一波带走
    优势:沙箱机制(虚拟系统程序,运行程序都是独立的,不会对现有系统产生影响),开销低

    docker架构
    三个基本概念
    镜像:image,root文件系统
    容器:镜像和容器===类似于===面向对象类和实例,镜像是静态的,容器是实体对象,可以被创建,启动,停止,删除,暂停
    仓库:保存镜像
    但是目前podman是比较流行
podman

    podman是开源容器运行的项目
    比docker的优势:不需要运行任何守护进程
                    没有root权限也可以运行

    介绍一下再linux系统下的安装:
    1、podman 终端执行,检测是否有此命令
    2、如果没有,执行:yum install podman
    3、查看podman容器运行状态列表:podman ps -a  (加上a会显示pause)
    4、查看podman镜像列表:podman images
    5、运行一个容器:

       
podman run -i -d -p 80:80 -v /data/:/data/ --privileged --name mytest centos:7.3.1611 /usr/sbin/init
        -i: 允许你对容器进行交互
        -d: 后台运行 不会进入容器
        -p 端口号,左侧服务器指向:右侧容器内端口号,服务器端口不能重复,如果多个容器多个应用,需要nginx反响代理
        -v 文件存储,左侧为映射到本地:右侧为容器内文件夹,防止镜像过大,迁移困难
        --privileged: 和最后的参数/usr/sbin/init共同使用 才会有更高的权限控制
        --name: 自定义容器启动的名称
        centos:7.3.1611: 镜像名称 如果本地没有 会从网络上下载
        也可以加入其它的参数 如-m 8G --cpus="4"
        -m 8G :内存分配为8G
        --cpus="4": 分配cpu核心总数为4

    6、进入容器:

     
    podman exec -i -t 7f5d968e2cf2 /bin/bash
        -i: 允许你对容器进行交互
        -t: 在新容器内指定一个伪终端或终端
        243c32535da7:容器id可以用podman ps -a查看 也可以用名称代替
    7、容器如果是挺值得,开启命令podman start mytest(容器名称)
    8、停止运行中的容器,podman stop mytest(容器名称)
    9.修改运行的参数 直接是不能修改运行的参数的 所以启动前要想好加入什么样的参数 如果一定要修改 可以先提交出一个容器为一个镜像 podman commit A B
        A为容器名称 B为生成的镜像名称 然后重新执行第5步骤 注意如果容器过大这步会导致所有podman命令不能执行 不能进入其他容器 但容器内部运行正常
        建议没有其他人操作时这样处理 如果着急执行那就先导出容器 再导入 这个过程前期只会导致podman ps不能执行 最后Storing signatures的过程会和commit效果一样 但时间相较短 10几分钟左右 建议项目目录映射出来 这样容器不会过大
    10.删除一个容器 podman rm mytest 最后的参数为容器名称也可以容器id 加-f参数为强制执行 加-f之前一定要观察好正常不能删除报的是什么错
    11.删除一个镜像 podman rmi 7f5d968e2cf2最后的参数为镜像id号 可以用podman images查看
    12.导出一个压缩镜像 podman save mytest | gzip > mytest.tar.gz
    13.导入一个压缩镜像 gunzip -c mytest.tar.gz | podman load
    14.导出一个容器podman export mytest > mytest.tar 压缩导出 podman export mytest | gzip> mytest.tar.gz
    15.导入一个容器cat mytest.tar | podman import - mytest
#89
Podman / Podman开机自启容器实现过程及与Docker对比
上次发布者 jvip_chen - 2022-1月-14 11:28 上午
1.podman介绍
podman之前是CRI-O项目的一部分,后被分离成独立的项目libpod,libpod是一个创建容器pod的工具和库,podman是个无守护程序容器引擎,以root用户或无根模式运行,简而言之podman提供了一个docker-CLI的命令行,管理着容器

2.与docker相比的优势
docker劣势一:
docker大家都知道,其守护程序在多个核心上占用差不多高达100%cpu资源,采用C/S模型
podman优势一:
podman不需要守护进程,不需要root权限组,而且利用着用户命名空间(namespace)模拟容器中的root运行,采用fork/exec模型。
fork/exec模型相比C/S模型优势:
系统管理员知道某个容器由谁启动
利用cgroup对podman做限制,对应着创建的容器也会受到限制
systemd单元文件的生成,可以管理着任务的启动与关闭
socket激活,将socker从systemd发送给podman容器使用

3.兼容性
docker的功能大部分podman都是兼容的,也可以使用别名(alias)来写成docker的命令

4.后台服务单元文件的优先级
/usr/lib/systemd/user:优先级最低,会被优先级高的同名 unit 覆盖 ~/.local/share/systemd/user
/etc/systemd/user:全局共享的用户级 unit
~/.config/systemd/user:优先级最高

5.podman基本操作
安装
#默认centos源
[root@slave02 ~]# yum -y  module install container-tools   #容器工具基于模块
[root@slave02 ~]# yum  -y install podman-docker            #安装docker兼容包(可选)
版本
[root@slave02 ~]# podman -v
podman version 3.3.0-dev
仓库
官方仓库:registry.access.redhat.com
第三方仓库:docker.io
私有仓库:registry.lab.example.com

命令帮助
[root@slave02 ~]# podman help|head -15
Manage pods, containers and images
Usage:
  podman [options] [command]
Available Commands:
  attach      Attach to a running container
  auto-update Auto update containers according to their auto-update policy
  build       Build an image using instructions from Containerfiles
  commit      Create new image based on the changed container  #基于修改的容器创建新的容器
  container   Manage containers
  cp          Copy files/folders between a container and the local filesystem
  create      Create but do not start a container
  diff        Display the changes to the object's file system
  events      Show podman events
....
镜像加速器
修改配置文件:/etc/containers/registries.conf 即可

注意:不能带有httpds//:url格式
[root@slave02 ~]# cp /etc/containers/registries.conf  /backup/registries.conf.back  #备份一下         
[root@slave02 ~]# vim  /etc/containers/registries.conf
unqualified-search-registries = ["docker.io"]           #非限定搜索登记处
[[registry]]
prefix = "docker.io"
location = "x"             #x是阿里加速镜像地址
拉取镜像
[root@slave02 ~]# podman pull nginx
6.运行一个web容器

后台启动一个web容器,并访问容器内容
#准备html页面内容
[root@192 ~]# cat /opt/webhtml/index.html
Go your own way, see your own scenery, surpass others without complacency, and be surpassed without losing ambition
#运行一个守护web容器进程,将/opt/webhtml目录内容映射到容器的/usr/share/nginx/html存放网页的位置
[root@192 ~]# podman run -d --name web -p 8888:80 -v /opt/webhtml:/usr/share/nginx/html nginx
3528e6d5148bcf980f0df5708a82419d3485a33d1d16d722db3e880cc103cd2c
[root@podman ~]# curl 192.168.136.129:8888
Go your own way, see your own scenery, surpass others without complacency, and be surpassed without losing ambition
#容器的ip
[root@podman ~]# podman inspect web|grep IPAddress
"IPAddress": "10.88.0.6",
"IPAddress": "10.88.0.6",
#宿主机的ip
[root@podman ~]# ip r
192.168.136.0/24 dev ens33 proto kernel scope link src 192.168.136.129 metric 100
#由于进行了端口绑定,所以直接 curl 192.168.136.129:8888即可访问
进入后台web容器,查看服务状态
[root@podman ~]# podman exec -it  web bash
root@3528e6d5148b:/# service nginx status
[ ok ] nginx is running.                             #运行中
修改容器业务内容
#修改宿主机/opt/webhtml/index.html即可
[root@podman ~]# cat /opt/webhtml/index.html
Go your own way, see your own scenery, surpass others without complacency, and be surpassed without losing ambitionRHCAS
RHCE RHCA
#进行访问
[root@podman ~]# curl 192.168.136.129:8888
Go your own way, see your own scenery, surpass others without complacency, and be surpassed without losing ambitionRHCAS
RHCE RHCA
#进入容器查看内容是否修改
[root@podman ~]# podman exec -it web bash
root@3528e6d5148b:/# cat /usr/share/nginx/html/index.html
Go your own way, see your own scenery, surpass others without complacency, and be surpassed without losing ambitionRHCAS
RHCE RHCA
暂停与删除容器
#暂停
[root@podman ~]# podman stop web
web
[root@podman ~]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS                     PORTS                 NAMES
3528e6d5148b  docker.io/library/nginx:latest  nginx -g daemon o...  25 minutes ago  Exited (0) 16 seconds ago  0.0.0.0:8888->80/tcp  web
#删除
[root@podman ~]# podman rm web
3528e6d5148bcf980f0df5708a82419d3485a33d1d16d722db3e880cc103cd2c
#或强制删除运行中的容器
[root@podman ~]# podman rm  -f web
3528e6d5148bcf980f0df5708a82419d3485a33d1d16d722db3e880cc103cd2c

7.web容器设置开机自启

后台运行一个web容器
[root@podman ~]# podman run --name web -d -p 8080:80 -v /opt/webhtml:/usr/shar/nginx/html nginx
910db3ab6bd1ef18e5fd0afe1844912f0b89334b7b8ab758353a948a1b55282a
基于web容器,在优先级一般的/etc/systemd/system内
创建.service单元文件
[root@192 ~]# cd /etc/systemd/system/
[root@podman user]# podman generate systemd --
--container-prefix  (Systemd unit name prefix for containers)
--files             {生成.service文件,而不是打印到标准输出}
--format            (Print the created units in specified format (json)) #以指定的格式打印单元文件
--name              (Use container/pod names instead of IDs)  #创建新容器,而不是使用现有的容器
--new               (Create a new container instead of starting an existing one)#(跳过标头生成)
--no-header         (Skip header generation)
--pod-prefix        (Systemd unit name prefix for pods)
--restart-policy    (Systemd restart-policy)
--separator         (Systemd unit name separator between name/id and prefix)
--time              (Stop timeout override)
[root@192 system]# podman generate systemd --name web --files --new
/etc/systemd/system/container-web.service
查看生成的单元文件
[root@192 system]# cat container-web.service
# container-web.service
# autogenerated by Podman 3.3.0-dev                                 #podman 3.3.0-dev自动生成
# Tue Aug 17 13:03:13 CST 2021                                      #8月17日星期二13:03:13 CST 2021                                                           
[Unit]       #单元
Description=Podman container-web.service              #描述
Documentation=man:podman-generate-systemd(1)          #帮助以及生成的系统
Wants=network-online.target                           #网络
After=network-online.target
RequiresMountsFor=%t/containers                         #前面不重要直接跳过
[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n                   
Restart=on-failure                  #故障时重新启动
TimeoutStopSec=70                   #超时时间   
ExecStart=/usr/bin/podman run --sdnotify=conmon --cgroups=no-conmon --rm --replace --name web -d -p 8080:80 -v /opt/webhtml:/usr/shar/nginx/html nginx   #执行开始为/usr/bin/podman  运行刚才创建的容器
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target default.target
删除刚才的容器
[root@podman ~]# podman rm web
910db3ab6bd1ef18e5fd0afe1844912f0b89334b7b8ab758353a948a1b55282a
[root@podman ~]# podman ps -a
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
设置开机自启
[root@192 ~]# systemctl daemon-reload
[root@192 ~]# systemctl enable --now container-web.service
Created symlink /etc/systemd/system/multi-user.target.wants/container-web.service → /etc/systemd/system/container-web.service.
Created symlink /etc/systemd/system/default.target.wants/container-web.service → /etc/systemd/system/container-web.service.
[root@192 user]# podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS                   NAMES
b0c7709cb00e  docker.io/library/nginx:latest  nginx -g daemon o...  15 seconds ago  Up 16 seconds ago  0.0.0.0:8080->80/tcp    web
无根root模式设置容器和上面这种方式大同小异

使用systemctl命令带上 --user 即可
#需要运行loginctl enable-linger命令,使用户服务在服务器启动时自动启动即可
[containers@serverb ~]$ loginctl enable-linger

以上就是Podman开机自启容器实现过程的详细内容,更多关于Podman开机自启容器的资料请关注脚本之家其它相关文章!
#90
Podman / Podman的安装与使用
上次发布者 jvip_chen - 2022-1月-14 11:02 上午
安装
yum -y install podman
使用
podman ps -a
podman run -dt -p 8080:8080/tcp
可以看到和docker类似