前言
之前一直在用 bash 脚本自动化,但是因为不熟悉语法,总感觉维护脚本的工作量比 python 大,这次重新写一个 Python 脚本来自动化执行 docker 下的命令。即对每个容器执行 exec 命令,我这里的应用是开启每个容器的 SSH 服务。
正文
直接贴代码,container 列表中的容器 id 是我人工 docker ps 添加的,其实这一步应该也能自动化,用字符串处理的方法提取容器 id 和对应容器名。但是又比较费工作量,加上之前已经有了容器 id 的清单了,所以这里就直接人工造表了(不够优雅)。
#! /usr/bin/python3
# -*- encoding: utf-8 -*-
'''
@File : server-docker-start-ssh-demo.py
@Time : 2022/10/26 9:23:00
@Author : Haulyn5
@Version : 1.0
@Contact : https://blog.csdn.net/Haulyn5?type=blog
'''
import subprocess # 用于开启子进程,执行命令
container=[
"eddb", # 便于查询的备注,如张三;另外容器 id 可以只写前几位,如果足以区分其他容器
"f8bb" # 便于查询的备注,如李四
]
for container_id in container:
command = f'docker exec -it {container_id} bash -c "service ssh start"' # docker 命令,在容器内执行 service ssh start
output_str = subprocess.run(command, shell=True, capture_output=True)
print(output_str) # 这里其实好像不是 str,可以更优雅一点,只输出 output
具体要在每个容器内执行某个命令,把 service ssh start 命令换成需要的命令即可。
其实这里还可以用 python 的 docker 库,但是需要安装,我这里为了省工作量,就直接相当于用 shell 命令去执行了。输出大概如下图所示,可以看到比较杂乱,可以做一些处理只输出需要的内容,这里不做进一步深挖了。
附录
另外,测试的时候,发现 Python 3.6 会不兼容代码,升级到 3.8.10 后可以顺利执行,忘记当时的报错了。。
subprocess 库文档:
nullhttps://docs.python.org/zh-cn/3/library/subprocess.html