批量备份当前docker所有容器

还得是chatgpt

#!/bin/bash

# 获取所有正在运行的容器ID
container_ids=$(sudo docker ps -q)

# 循环遍历容器ID并执行备份
for container_id in $container_ids; do
    # 获取容器名称
    container_name=$(sudo docker inspect --format='{{.Name}}' $container_id)

    # 去掉容器名称中的斜杠字符
    container_name=${container_name:1}

    # 指定备份文件名(可根据需求自行更改)
    backup_file="${container_name}_backup"

    # 备份容器
    sudo docker commit $container_id $backup_file

    # 保存容器
    sudo docker save $backup_file -o "${backup_file}.tar"
    echo "Container $container_name backed up as $backup_file"
done

注意映射后的文件需要单独备份

nginx用域名http://xx.com/aaa/代理一个网页http://ff.com但是请求资源时发生404

哎,还得是chatgpt,难道就没有人有这种使用场景吗?没查到一个配置是有效的。

  • 我:

    我配置了nginx反向代理,用域名http://xx.com/aaa/代理一个网页http://ff.com,
    但是请求资源时发生404,如何解决,我能够正确获取到dom

  • gpt-4-1106-preview:

    如果你已经成功配置了 Nginx 以使用 http://xx.com/aaa/ 代理到 http://ff.com,但在访问资源时遇到了 404 错误,可能的原因之一是资源的相对路径问题。当你使用子路径代理到另一个网站时,目标网站页面中的资源可能会因为路径不匹配而加载失败。

    例如,如果目标网站(http://ff.com)中有一张图片,其路径为 /images/pic.jpg,则该请求将在代理服务器上转换为 http://xx.com/aaa/images/pic.jpg。但是,如果 Nginx 配置中没有正确地重写资源的路径,资源请求会被发向错误的 URL,导致 404 错误。

    为了解决这个问题,你需要确保 Nginx 的配置能够正确处理路径重写。下面是一个基本的例子,展示如何为 Nginx 设置代理并重写 URL 路径:

    server {
        listen 80;
        server_name xx.com;
    
        location /aaa/ {
            proxy_pass http://ff.com/; # 确保末尾有斜杠
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    
            # 重写路径:移除 aaa
            rewrite ^/aaa/(.*) /$1 break;
    
            # 如果需要,处理 HTML 内嵌资源的路径问题
            sub_filter 'src="/' 'src="/aaa/';
            sub_filter 'href="/' 'href="/aaa/';
            sub_filter_once off;
       }
    }

    在这个配置中,rewrite 指令用于从传入的请求 URL 中删除 /aaa/ 子路径,保持后端请求的正确性。sub_filter 指令用于处理返回的 HTML 内容,将资源的路径前缀修改为 /aaa/,使它们在反向代理环境中有效。请注意,这可能需要 Nginx 的 ngx_http_sub_module 模块支持。

    确保重写规则和替换操作符合你的实际需求,它们可能需要根据实际网站的结构进行调整。

    最后,不要忘记重新加载或重新启动 Nginx 以应用更新后的配置:

    sudo nginx -s reload
    # 或者
    sudo systemctl reload nginx

    一定要仔细检查网站的 HTML 和相关资源请求,确保所有的资源路径都能正确反映反向代理的结构。

    剩余的问题

    • 对于*.svg文件请求依然是404,不看图又不会死,直接不解决。
    • 对于api请求是404,哎懒得折腾了,直接把api请求单独重定向到一个同名路由成功访问,出现冲突了再说吧。
      像这样:

         location /api/ {
              proxy_pass http://127.0.0.1:8085/api/;
          }

【azure笔记 1】容器实例管理python sdk封装

容器实例管理python sdk封装

说明

  • 这是根据我的需求写的,所以有些参数是写死的,比如cpu核数和内存,你可以根据你的需要自行修改。
  • 前置条件:
    当前环境已安装python3.8以上版本和azure cli并且已经登陆到你的账户

    依赖安装

    requirments.txt

    azure-mgmt-resource
    azure-identity
    azure-mgmt-containerinstance
pip install -r requirments.txt

PS: 安装不上就多安几次或使用魔法

containerhelpor.py

from azure.identity import DefaultAzureCredential
from azure.mgmt.containerinstance import ContainerInstanceManagementClient
from azure.mgmt.containerinstance.models import ContainerGroup, Container, ContainerPort, IpAddress, ResourceRequests, ResourceRequirements

class ContainerHelpor:

    def create(subscription_id:str, resource_group:str, location:str, container_name:str, container_image:str, no_port:int, protocol: str='TCP'):

        # 使用默认 Azure 凭据进行验证
        credentials = DefaultAzureCredential()

        # 创建容器实例管理客户端实例
        container_client = ContainerInstanceManagementClient(credentials, subscription_id)

        # 容器端口和 IP 地址配置
        port1 = ContainerPort(port=no_port, protocol=protocol)
        ports = [port1]
        # port2 = ContainerPort(port=no_port + 1, protocol=protocol)
        # ports = [port1, port2]
        ip_address = IpAddress(ports=ports, type='Public')

        # 容器资源请求
        requests = ResourceRequests(memory_in_gb=1.0, cpu=1.0)
        requirements = ResourceRequirements(requests=requests)

        # 创建容器
        container = Container(
            name=container_name,
            image=container_image,
            resources=requirements,
            ports=ports
        )

        # 容器组(容器实例)
        container_group = ContainerGroup(
            location=location,
            containers=[container],
            os_type='Linux',
            ip_address=ip_address
        )

        # 创建容器实例
        container_group_result = container_client.container_groups.begin_create_or_update(resource_group, container_name, container_group)
        print(f"Container instance {container_name} created successfully.")
        return container_group_result

    def stop(subscription_id:str, resource_group:str, container_name:str):

        # 使用默认凭证进行身份验证
        credential = DefaultAzureCredential()

        # 创建容器实例管理客户端
        client = ContainerInstanceManagementClient(credential, subscription_id)

        # 停止容器实例
        client.container_groups.stop(resource_group, container_name)

        print(f"Container instance {container_name} stoped successfully.")

    def start(subscription_id:str, resource_group:str, container_name:str):

        # 使用默认凭证进行身份验证
        credential = DefaultAzureCredential()

        # 创建容器实例管理客户端
        client = ContainerInstanceManagementClient(credential, subscription_id)

        # 停止容器实例
        client.container_groups.begin_start(resource_group, container_name)

        print(f"Container instance {container_name} started successfully.")

    def remove(subscription_id:str, resource_group:str, container_name:str):
        # 创建 Azure 认证凭证
        credentials = DefaultAzureCredential()

        # 创建 ContainerInstanceManagementClient
        container_client = ContainerInstanceManagementClient(credentials, subscription_id)

        # 删除容器实例
        container_client.container_groups.begin_delete(resource_group, container_name)
        print(f"Container instance {container_name} deleted successfully.")

    def query_ip(subscription_id:str, resource_group:str, container_name:str):
        credential = DefaultAzureCredential()
        client = ContainerInstanceManagementClient(credential, subscription_id)

        container_group = client.container_groups.get(resource_group, container_name)

        return  container_group.ip_address

测试代码

import sys
import os
import time

# 此处根据你的项目选择包含目录以及导入导出模块
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
sys.path.append(parent_dir)
from core.containerhelpor import ContainerHelpor

def main():
    print("containerhelpor test begin")
    # 这里填你的订阅id
    sub_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    container_name = 'test' # 你的容器名称
    resource_group = 'jp' # 你的资源组组名
    print("ContainerHelpor.create begin")
    ContainerHelpor.create(subscription_id=sub_id,
    no_port=8080,
    resource_group=resource_group,
    location = 'Japan West',
    container_name = container_name,
    # 镜像名称以及tag默认指向dockerhub的latset
    container_image = '' 
    )
    print("ContainerHelpor.stop begin")
    ContainerHelpor.stop(sub_id,resource_group,container_name)

    print("ContainerHelpor.start begin")
    is_not_start = True
    retry_cnt = 0

    while is_not_start:
        try:
            ContainerHelpor.start(sub_id,resource_group,container_name)
            is_not_start = False
        except Exception as e: 
            time.sleep(2)
            retry_cnt += 1
            if retry_cnt > 3:
                print(e)
                ContainerHelpor.remove(sub_id,resource_group,container_name)
                print("containerhelpor test failed")
                return

    print("ContainerHelpor.query_ip begin")
    retry_cnt = 0
    ip = None
    while ip is None:
        ipaddr = ContainerHelpor.query_ip(sub_id,resource_group,container_name)
        ip = ipaddr.ip
        time.sleep(2)
        retry_cnt += 1
        if retry_cnt > 10:
            print("query_ip failed, try it later")
            break
    print(ip)
    print("ContainerHelpor.remove begin")
    ContainerHelpor.remove(sub_id,resource_group,container_name)

    print("containerhelpor test pass")
if __name__ == "__main__":
    main()