多种脚本批量下载 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 镜像。

目录
相关文章
|
JSON 移动开发 JavaScript
在浏览器执行js脚本的两种方式
【10月更文挑战第20天】本文介绍了在浏览器中执行HTTP请求的两种方式:`fetch`和`XMLHttpRequest`。`fetch`支持GET和POST请求,返回Promise对象,可以方便地处理异步操作。`XMLHttpRequest`则通过回调函数处理请求结果,适用于需要兼容旧浏览器的场景。文中还提供了具体的代码示例。
399 5
在浏览器执行js脚本的两种方式
|
JavaScript 数据库 Docker
一个有用的docker entrypoint脚本的范例
通过这个 Entrypoint 脚本,您可以确保在 Docker 容器启动时执行必要的初始化步骤,并且容器可以根据不同的运行时环境进行相应的配置和操作。这个范例展示了如何编写一个灵活且功能强大的 Entrypoint 脚本,使您的 Docker 容器更加可靠和易于管理。
619 3
|
安全 Java C#
Unreal Engine C# 脚本编写浅谈
本文介绍了在 Unreal Engine 中使用 C# 编写脚本的方法,涵盖环境搭建、基础概念、常见问题及代码案例。从安装插件到处理输入事件和加载蓝图,详细讲解了如何在 Unreal Engine 中高效利用 C# 进行开发。
755 3
【Azure App Service】PowerShell脚本批量添加IP地址到Web App允许访问IP列表中
Web App取消公网访问后,只允许特定IP能访问Web App。需要写一下段PowerShell脚本,批量添加IP到Web App的允许访问IP列表里!
367 2
【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext' is not recognized as the name
【Azure Web Job】Azure Web Job执行Powershell脚本报错 The term 'Select-AzContext' is not recognized as the name
202 3
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
906 0
|
数据安全/隐私保护
【Azure Entra ID】使用PowerShell脚本导出Entra ID中指定应用下的所有用户信息
在Azure Entra ID中,需要导出一个Application 下的用户信息, 包含User的创建时间。
455 0
|
JavaScript 前端开发
用JavaScript脚本将当地时间转换成其它时区
用JavaScript脚本将当地时间转换成其它时区
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
1032 0
|
Ubuntu Linux 测试技术
【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例
【Azure Function App】Python Function调用Powershell脚本在Azure上执行失败的案例
217 0