多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#

简介: 本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。

配置文件存放 Docker 镜像列表

  • docker-images.txt

说明:该示例文件格式(image-name:tag),配置需要下载的 docker 镜像信息。

nginx:latest
mongo:7.0.14
mongo-express:1.0.2-20-alpine3.19
# 这是一个注释

Shell 脚本下载 docker 镜像

  • download_images.sh
#!/bin/bash

# 检查是否安装了 Docker
if ! command -v docker &> /dev/null
then
    echo "Docker 未安装,请先安装 Docker。"
    exit 1
fi

# 检查配置文件是否存在
CONFIG_FILE="docker-images.txt"
if [ ! -f "$CONFIG_FILE" ]; then
    echo "配置文件 $CONFIG_FILE 不存在。"
    exit 1
fi

# 读取配置文件并逐行处理
while IFS= read -r line
do
    # 跳过空行和注释行(以 # 开头)
    if [[ -z "$line" || "$line" =~ ^# ]]; then
        continue
    fi

    # 提取镜像名称和标签
    IMAGE_NAME=$(echo "$line" | cut -d':' -f1)
    IMAGE_TAG=$(echo "$line" | cut -d':' -f2)

    # 如果 IMAGE_TAG 为空,则默认为 latest
    if [ -z "$IMAGE_TAG" ]; then
        IMAGE_TAG="latest"
    fi

    # 下载 Docker 镜像
    echo "正在下载 Docker 镜像: ${IMAGE_NAME}:${IMAGE_TAG}"
    docker pull "${IMAGE_NAME}:${IMAGE_TAG}"

    # 检查镜像是否下载成功
    if [ $? -eq 0 ]; then
        echo "Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG} 下载成功。"
    else
        echo "Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG} 下载失败。"
        exit 1
    fi
done < "$CONFIG_FILE"

使用方式

  1. 创建配置文件:
    • 创建 docker-images.txt 文件并添加需要下载的镜像列表。
  2. 运行脚本:
# 赋予脚本执行权限
chmod +x download_images.sh
# 运行脚本
./download_images.sh

PowerShell 下载 docker 镜像

  • download_images.ps1
# 检查是否安装了 Docker
if (-not (Get-Command docker -ErrorAction SilentlyContinue)) {
   
    Write-Output "Docker 未安装,请先安装 Docker。"
    exit 1
}

# 配置文件路径
$CONFIG_FILE = "docker-images.txt"

# 检查配置文件是否存在
if (-not (Test-Path $CONFIG_FILE)) {
   
    Write-Output "配置文件 $CONFIG_FILE 不存在。"
    exit 1
}

# 读取配置文件并逐行处理
Get-Content $CONFIG_FILE | ForEach-Object {
   
    $line = $_.Trim()

    # 跳过空行和注释行(以 # 开头)
    if ([string]::IsNullOrEmpty($line) -or $line.StartsWith("#")) {
   
        return
    }

    # 提取镜像名称和标签
    $parts = $line -split ':'
    $IMAGE_NAME = $parts[0]
    $IMAGE_TAG = if ($parts.Length -gt 1) {
    $parts[1] } else {
    "latest" }

    # 下载 Docker 镜像
    Write-Output "正在下载 Docker 镜像: ${IMAGE_NAME}:${IMAGE_TAG}"
    $result = docker pull "${IMAGE_NAME}:${IMAGE_TAG}"

    # 检查镜像是否下载成功
    if ($LASTEXITCODE -eq 0) {
   
        Write-Output "Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG} 下载成功。"
    } else {
   
        Write-Output "Docker 镜像 ${IMAGE_NAME}:${IMAGE_TAG} 下载失败。"
        exit 1
    }
}

使用方式

2、运行脚本

2.1 保存上述 PowerShell 脚本为 download_images.ps1。
2.2 打开 PowerShell 并赋予脚本执行权限(如果需要):
powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

2.3 运行脚本:
powershell
.\download_images.ps1

js 脚本下载 docker 镜像

  • download_images.js
const fs = require('fs');
const {
    exec } = require('child_process');

// 检查是否安装了 Docker
exec('docker --version', (error, stdout, stderr) => {
   
    if (error) {
   
        console.error("Docker 未安装,请先安装 Docker。");
        process.exit(1);
    }
    console.log(stdout.trim());

    // 配置文件路径
    const CONFIG_FILE = 'docker-images.txt';

    // 检查配置文件是否存在
    if (!fs.existsSync(CONFIG_FILE)) {
   
        console.error(`配置文件 ${
     CONFIG_FILE} 不存在。`);
        process.exit(1);
    }

    // 读取配置文件并逐行处理
    fs.readFile(CONFIG_FILE, 'utf8', (err, data) => {
   
        if (err) {
   
            console.error(`读取配置文件 ${
     CONFIG_FILE} 失败:`, err);
            process.exit(1);
        }

        const lines = data.split('\n');

        lines.forEach(line => {
   
            const trimmedLine = line.trim();

            // 跳过空行和注释行(以 # 开头)
            if (trimmedLine === '' || trimmedLine.startsWith('#')) {
   
                return;
            }

            // 提取镜像名称和标签
            const parts = trimmedLine.split(':');
            const IMAGE_NAME = parts[0];
            const IMAGE_TAG = parts.length > 1 ? parts[1] : 'latest';

            // 下载 Docker 镜像
            console.log(`正在下载 Docker 镜像: ${
     IMAGE_NAME}:${
     IMAGE_TAG}`);
            exec(`docker pull ${
     IMAGE_NAME}:${
     IMAGE_TAG}`, (error, stdout, stderr) => {
   
                if (error) {
   
                    console.error(`Docker 镜像 ${
     IMAGE_NAME}:${
     IMAGE_TAG} 下载失败。`);
                    console.error(stderr);
                    process.exit(1);
                }
                console.log(`Docker 镜像 ${
     IMAGE_NAME}:${
     IMAGE_TAG} 下载成功。`);
                console.log(stdout);
            });
        });
    });
});

使用方式

2、保存 Node.js 脚本:

  • 将上述脚本保存为 download_images.js

3、运行脚本:

打开终端或命令提示符,导航到保存脚本的目录。
运行脚本:
bash
node download_images.js

使用 C# 实现 docker 镜像下载

异步方式,批量下载 docker 镜像;

using System;
using System.IO;
using System.Diagnostics;

namespace ConsoleApp1;

class Program
{
   
    static async Task Main(string[] args)
    {
   
        // 检查是否安装了 Docker
        if (!await IsDockerInstalledAsync())
        {
   
            Console.WriteLine("Docker 未安装,请先安装 Docker。");
            Environment.Exit(1);
        }

        // 配置文件路径
        string config_file = "docker-images.txt";

        // 检查配置文件是否存在
        if (!File.Exists(config_file))
        {
   
            Console.WriteLine($"配置文件 {config_file} 不存在。");
            Environment.Exit(1);
        }

        // 读取配置文件并逐行处理
        string[] lines = File.ReadAllLines(config_file);

        foreach (string line in lines)
        {
   
            string trimmedLine = line.Trim();

            // 跳过空行和注释行(以 # 开头)
            if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.StartsWith("#"))
            {
   
                continue;
            }

            // 提取镜像名称和标签
            string[] parts = trimmedLine.Split(':');
            string image_name = parts[0];
            string image_tag = parts.Length > 1 ? parts[1] : "latest";

            // 下载 Docker 镜像
            Console.WriteLine($"正在下载 Docker 镜像: {image_name}:{image_tag}");
            if (await PullDockerImageAsync(image_name, image_tag))
            {
   
                Console.WriteLine($"Docker 镜像 {image_name}:{image_tag} 下载成功。");
            }
            else
            {
   
                Console.WriteLine($"Docker 镜像 {image_name}:{image_tag} 下载失败。");
                Environment.Exit(1);
            }
        }
    }

    static async Task<bool> IsDockerInstalledAsync()
    {
   
        try
        {
   
            ProcessStartInfo psi = new()
            {
   
                FileName = "docker",
                Arguments = "--version",
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };

            using Process process = new() {
    StartInfo = psi };
            process.Start();
            string output = await process.StandardOutput.ReadToEndAsync();
            await process.WaitForExitAsync();
            await Console.Out.WriteLineAsync(output.Trim());
            return process.ExitCode == 0;
        }
        catch
        {
   
            return false;
        }
    }

    static async Task<bool> PullDockerImageAsync(string imageName, string imageTag)
    {
   
        try
        {
   
            ProcessStartInfo psi = new()
            {
   
                FileName = "docker",
                Arguments = $"pull {imageName}:{imageTag}",
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };

            using Process process = new() {
    StartInfo = psi };
            process.Start();
            string output = await process.StandardOutput.ReadToEndAsync();
            string error = await process.StandardError.ReadToEndAsync();
            await process.WaitForExitAsync();
            await Console.Out.WriteLineAsync(output.Trim());
            if (!string.IsNullOrEmpty(error))
            {
   
                Console.WriteLine(error);
            }
        }
        catch (Exception ex)
        {
   
            Console.WriteLine($"发生错误: {ex.Message}");
            return false;
        }
    }
}

使用方式

说明:使用该方式,需要安装好 .net8 runtime

2、创建并运行 C# 控制台应用程序:

  • 2.1 使用 Visual Studio Code.NET CLI 创建一个新的控制台应用程序。
  • 2.2 将上述代码复制到 Program.cs 文件中。
  • 2.3 将 docker-images.txt 文件放在与 Program.cs 文件相同的目录中。
  • 2.4 运行应用程序:
dotnet run

通过这些步骤,上面的脚本将能够从 docker-images.txt 文件中批量下载 Docker 镜像。

目录
相关文章
|
8月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
722 9
|
8月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
735 2
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
11月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
372 60
|
8月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
10月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1147 1
|
12月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
521 17
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
1781 25
|
12月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
345 4
|
12月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
607 3