Skip to content

常见命令

📅 发表于 2026/01/28
🔄 更新于 2026/01/28
👁️ -- 次访问
📝 0 字
0 分钟
cmd
#docker
#podman
#git
#pip
#ray
#kill
#heredoc

容器镜像

核心概念

Docker 核心概念

镜像 (Image)

  • 系统安装盘/快照静态只读pull的内容
  • 包含运行程序所需的所有环境(python, 库, 代码, 配置等)

容器 (Container)

  • 从镜像运行起来的实例,镜像运行起来后就是容器
  • 安装盘安装好了一台电脑,可以使用了。

仓库 (Repository/Hub)

  • 存放镜像的地方。就像手机的应用商店。

常见命令

bash
# podman 安装
sudo apt-get update
sudo apt-get -y install podman
# 拉取镜像
podman pull anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/python:latest
# 运行镜像
podman run -it --name test 79bb5ed1866f /bin/bash

# 执行已有容器
podman exec -it 069dcd bash

# 查看关键信息
podman info | grep -E "graphDriverName|mount_program|freeLocks|volumePath|runRoot"

# 删除服务
pkill -f "podman system service"
# 删除物理文件,经常报错database graph driver "" does not match our graph driver "vfs": database configuration mismatch 
# root 用户
rm -rf /var/lib/containers/storage
# root less
rm -rf ~/.local/share/containers/storage

# 启动服务
podman system service -t 0 unix:///tmp/podman.sock &
export DOCKER_HOST=unix:///tmp/podman.sock
# 验证,回复ok则正确
curl -H "Content-Type: application/json" --unix-socket /tmp/podman.sock http://localhost/_ping

# 加载镜像
podman load -i my_image.tar

# 查看镜像
podman images

# 查看运行镜像
podman ps
bash
# 重启
sudo systemctl daemon-reload
sudo systemctl restart docker

# 查看具体报错日志
dockerd

# 停止可能残存的进程
sudo pkill dockerd
sudo pkill containerd
bash
# 杀掉容器
podman ps -aq --filter "name=minisweagent-" | xargs -r podman rm -f
podman rm -f $(podman ps -q --filter "status=running")
podman ps -q --filter "status=running"

# 删除所有的
podman rm -af
命令用途备注
docker pull <镜像名>从云端下载镜像比如 docker pull python:3.11
docker images列出本地所有镜像检查你下好了哪些环境
docker ps查看正在运行的容器加上 -a 可以看所有容器(包括已停止的)
docker run <参数> <镜像>最常用:根据镜像启动一个容器-it 交互模式,-d 后台运行
docker exec -it <容器ID> bash进入一个正在运行的容器内部方便你手动调试环境
docker rm <容器ID>删除容器如果任务跑挂了,清理掉它
docker rmi <镜像ID>删除镜像节省硬盘空间

podman配置

网络配置:/etc/containers/containers.conf

bash
[containers]
# 设置容器默认的 DNS 服务器
dns_servers = [
    "8.8.8.8",
    "114.114.114.114"
]
netns="host"

存储路径配置:/etc/containers/storage.conf,其中driver默认不是vfs,特殊情况才用这个。

bash
[storage]
driver = "vfs"
graphroot="/var/lib/containers/storage"
runRoot="/run/containers/storage"

其他环境变量配置

bash
export DOCKER_HOST=unix:///tmp/podman.sock
alias docker="podman --network host"

Docker 配置

/etc/docker/daemon.json

bash
{
  "data-root": "/xxx/docker_root",
  "storage-driver": "vfs" # nas
}

本机磁盘 overlay 使用

背景

背景

背景

  • poodman/docker 无法直接使用overlay,只能使用vfs,但vfs太慢了。
  • 期望在本地磁盘使用overlay

核心思路

  • 在本地磁盘开一个巨大的空文件,格式化为ext4格式。
  • 通过LoopDevice把这个文件挂载到一个目录上。如果没有loopdevice,则需要创建。
  • 配置Podman把数据存储在这个目录,podman使用overlay配置

构建明细

查看是否存在loop设备,如果不存在,则先建立loop设备

bash
# 查看是否存在
losetup -f  

# 进入容器后执行
for i in $(seq 0 7); do
  if [ ! -e /dev/loop$i ]; then
    mknod /dev/loop$i b 7 $i
  fi
done

# 确保 loop-control 存在
if [ ! -e /dev/loop-control ]; then
  mknod /dev/loop-control c 10 237
fi

建立文件

bash
# 这里依据磁盘空间,来设立,但不要打满了。
truncate -s 4608G /podman_disk.img

挂载

bash
# 挂载
losetup /dev/loop0 /podman_disk.img
# 查看
losetup -a

ext4 格式化

bash
mkfs.ext4 -E lazy_itable_init=1 /dev/loop0

建立podman run root文件夹

bash
mkdir -p /podman_data/storage
mkdir -p /podman_data/storage/overlay

挂载loop设备到指定文件夹

bash
# 挂载
mount -t ext4 /dev/loop0 /podman_data/storage 
# 检查
df -h /dev/loop0
# 卸载命令
umount /root/podman_data 2>/dev/null

配置/etc/contaners/storage.conf

bash
[storage]
driver = "overlay"
graphroot="/podman_data/storage"
runRoot="/run/containers/storage"

[storage.options.overlay]
mountopt = "nodev,metacopy=on"

之前旧的是这个

bash
[storage]
driver = "vfs"
graphroot="/var/lib/containers/storage"
runRoot="/run/containers/storage"

podman 清空和重启

bash
# 命令
podman rm -a -f >/dev/null 2>&1 || true

# 直接删除文件夹
rm -rf /var/lib/containers/storage/*
rm -rf /run/containers/storage/*

# 重置
podman system reset --force

构建总结脚本

bash
#!/bin/bash
# 快速重建 4.5T 环境
truncate -s 4808G /podman_disk.img
mknod /dev/loop0 b 7 0 2>/dev/null
losetup /dev/loop0 /podman_disk.img
mkfs.ext4 -E lazy_itable_init=1 /dev/loop0
mkdir -p /podman_data/storage/overlay
mount -t ext4 /dev/loop0 /podman_data/storage
echo "环境已就绪!"

清空

清除容器

bash
# 强行删除所有容器(无论是否在运行)
podman rm -a -f
# 删除所有已加载的镜像
podman rmi -a -f
# 清理所有插件、卷和残留元数据
podman system reset --force

卸载挂载点

bash
# 0. 先看是否有占用,清掉进程
fuser -m /podman_data/storage
kill -9 PID
# 1. 卸载挂载点
umount /podman_data/storage
# 2. 断开 Loop 设备关联
losetup -d /dev/loop0
# 3. 检查是否还有残留关联(应该为空)
losetup -a

删除大文件

bash
# 删除那个虚拟磁盘文件
rm -f /podman_disk.img

# 删除挂载目录(保持根目录整洁)
rm -rf /podman_data

常用命令

Git 相关

常用git 命令

Basic

bash
# 拉取远程tag并切换
git fetch --all --tags
git checkout core_v0.12.2

# 拉取远程分支并切换
git fetch origin
# git checkout core_r0.15.0
git checkout core_r0.14.0
# 查看branch
git branch

# 安装git-lfs
sudo apt-get install git-lfs
# 在git文件夹中,使用git lfs 拉取远程
git lfs pull

拉取分值并合并

bash
# 本地先提交
git add *
git commit -m "0110"

# 拉取远程分支,做合并
git pull --rebase

撤回合并

bash
# 查看历史head
git reflog

# 撤回到你的那个版本
git reset --hard HEAD@{3}

Exception: File src/appworld/.source/apps.bundle is a Git LFS pointer and not a bundle file.

bash
# 拉取仓库下的依赖大文件,因为遇见报错
git lfs install
git lfs pull

Git Patch 语法

Git Patch 语法

文件路径:锁定目标文件

  • --- a/:修改前的文件状态
  • +++ b/:修改后的文件状态。
  • 告诉Git,请找到这个文件 sympy/parsing/sympy_parser.py

行号坐标

  • @@ -1119,6 +1119,29 @@ class EvaluateFalseTransformer(ast.NodeTransformer):
  • @@ ... @@
  • -1119,6:修改前的文件,代码从1119行开始,占了6行
  • +1119,29:修改后的文件,代码从1119行开始,占了29行。
  • class EvaluateFalseTransformer(ast.NodeTransformer):快速定位在哪个函数里

开头和末尾无标记的代码片段:帮助定位

  • 开头的几行:修改位置前面的代码
  • 末尾的几行:修改位置后面的代码

内容标记

  • +:新增行。
  • -:删除行。

如下示例

bash
diff --git a/sympy/parsing/sympy_parser.py b/sympy/parsing/sympy_parser.py
--- a/sympy/parsing/sympy_parser.py
+++ b/sympy/parsing/sympy_parser.py
@@ -1119,6 +1119,29 @@ class EvaluateFalseTransformer(ast.NodeTransformer):
         'exp', 'ln', 'log', 'sqrt', 'cbrt',
     )
 
+    relational_operators = {
+        ast.NotEq: 'Ne',
+        ast.Lt: 'Lt',
+        ast.LtE: 'Le',
+        ast.Gt: 'Gt',
+        ast.GtE: 'Ge',
+        ast.Eq: 'Eq'
+    }
+    def visit_Compare(self, node):
+        if node.ops[0].__class__ in self.relational_operators:
+            sympy_class = self.relational_operators[node.ops[0].__class__]
+            right = self.visit(node.comparators[0])
+            left = self.visit(node.left)
+            new_node = ast.Call(
+                func=ast.Name(id=sympy_class, ctx=ast.Load()),
+                args=[left, right],
+                keywords=[ast.keyword(arg='evaluate', value=ast.NameConstant(value=False, ctx=ast.Load()))],
+                starargs=None,
+                kwargs=None
+            )
+            return new_node
+        return node
+
     def flatten(self, args, func):
         result = []
         for arg in args:

Pip 相关

bash
# 生成当前环境安装情况
pip freeze > requirements.txt

配置镜像,可能没效了。

bash
[global]
index-url=https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

Ray 相关

bash
ray start --head --dashboard-host=0.0.0.0
ray start --address='x.x.x.x:6379'
ray job submit --address="x.x.x.x:6379" \
    --runtime-env=verl/trainer/runtime_env.yaml \
    --no-wait \
    -- \

ray job logs raysubmit_xxxxx

ray job stop raysubmit_xxx

ray status
ray stop

复制粘贴

bash
sudo apt update && sudo apt install rsync -y

rsync -av --size-only /path1  /path2

解压缩

bash
sudo apt-get install zip

压缩命令:tar -czvf appworld.tar.gz appworld
-c:create 的缩写,表示创建一个新的归档文件。
-z:通过 gzip 进行压缩或解压缩。这是生成 .gz 后缀的关键。
-v:verbose 的缩写,表示显示详细过程。执行命令时,它会把正在处理的文件名打印在屏幕上,让你知道命令正在正常工作。对于大文件或目录,这个参数非常有用。
-f:file 的缩写,表示后面要跟文件名。这个参数告诉 tar 你要操作的文件是 appworld.tar.gz,而不是标准输入/输出。注意:-f 后面必须紧跟着文件名。
总结记忆: czvf 可以记成 "Create Zipped Verbose File"(创建一个带Gzip压缩并显示过程的文件)。

解压缩命令:tar -xzvf appworld.tar.gz
-x:extract 的缩写,表示提取/解压文件从归档中。
-z:同样表示使用 gzip。在解压时,tar 会用它来解开 .gz 压缩。
-v:同样表示显示详细过程。
-f:同样表示后面要跟文件名。
总结记忆: xzvf 可以记成 "Extract Zipped Verbose File"(解压一个带Gzip压缩并显示过程的文件)。

Log 相关

bash
bash train.sh 2>&1 | tee logs/temp.log

Kill 相关

bash
pkill -f uvicorn
pkill -9 -f uvicorn
ps aux | grep '[u]vicorn' | awk '{print $2}' | xargs kill

杀掉gpu僵尸进程

bash
sudo apt-get install -y psmisc
sudo fuser -k -9 /dev/nvidia*

Heredoc 相关

Heredoc

核心目的

  • 把很长的字符串,直接塞给命令,而不需要把文字写进真实文件。

定界符

  • 可以是任意字符串成对出现起始结束位置。告诉系统从第一个定界符看到第二个停止。
  • 第1个定界符需要加单引号:告诉系统不解析字符串里的变量。

格式

bash
命令 <<`定界符`
这里是你想输入的内容
可以有很多行
定界符

示例

bash
VAR="世界"
cat <<'EOF'
你好,$VAR
EOF
# 输出:你好,$VAR

Apply Git Patch 示例

python
command = f"git apply <<'{delimiter}'\n{model_patch}\n{delimiter}"
bash
git apply <<'PATCH_12345'
--- a/file.py
+++ b/file.py
@@ -1,1 +1,1 @@
-old_code()
+new_fix_code()
PATCH_12345

VS Code

主要配置

VSCode 主要配置

安装插件

  • vscode-icons
  • semantic-highlighting
  • remote-ssh
  • onedark pro

Python语言解释器

  • Pylance (微软)

配置快捷键

  • 见下文文件

自定义python代码片段

  • 首选项 - 代码片段 - python.json
  • 具体见下文文件

其他相关配置

  • 关闭 enable preview,把勾掉去掉即可。workbench.editor.enablePreview”: true

自定义快捷键

json
// 将键绑定放在此文件中以覆盖默认值
[
    {
        "key": "shift+cmd+'",
        "command": "editor.action.addSelectionToNextFindMatch",
        "when": "editorFocus"
    },
    {
        "key": "cmd+d",
        "command": "-editor.action.addSelectionToNextFindMatch",
        "when": "editorFocus"
    },
    {
        "key": "cmd+d",
        "command": "editor.action.copyLinesDownAction",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "shift+alt+down",
        "command": "-editor.action.copyLinesDownAction",
        "when": "editorTextFocus && !editorReadonly"
    },
    {
        "key": "cmd+backspace",
        "command": "editor.action.deleteLines",
        "when": "textInputFocus && !editorReadonly"
    },
    {
        "key": "shift+cmd+k",
        "command": "-editor.action.deleteLines",
        "when": "textInputFocus && !editorReadonly"
    },
    {
        "key": "alt+cmd+left",
        "command": "workbench.action.navigateBackInNavigationLocations"
    },
    {
        "key": "alt+cmd+right",
        "command": "workbench.action.navigateForwardInNavigationLocations"
    }
]

python代码片段

json
{
  "Print to console": {
    "prefix": "header",
    "body": [
      "#!/usr/bin/env python",
      "# -*- coding: utf-8 -*-",
	  "",
	  "\"\"\"",
	  "@desc $1",
      "@author: liming.plm",
      "@create: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
      "\"\"\"",
    ],
    "description": "Add Python header"
  },
  "main": {
    "prefix": "main",
    "body": [
      "def main():",
      "    pass",
      "",
      "",
      "if __name__ == \"__main__\":",
      "    main()"
    ],
    "description": "main"
  }
}

文件索引配置(pyrightconfig)

在需要打开的vscode根目录下,新建pyrightconfig.json

例如,以verl为示例,我只需要verl和recipe文件夹建立索引。

json
{
  "exclude": [
    ".*",
    "*d*",
    "outputs",
    "logs",
    "verl/third_party",
  ],
  "include": [
    "verl",
    "recipe",
  ],
  "reportMissingTypeStubs": false,
}

例如,在openhands benchmarks根目录下,我需要引用其他文件夹的内容,比如software-agent-sdk,需设置extraPaths.

json
{
  "include": [
    "benchmarks",
    "." 
  ],
  "extraPaths": [
    "/xxxpath/pro/software-agent-sdk/openhands-sdk",
    "/xxxpath/pro/software-agent-sdk/openhands-tools",
    "/xxxpath/pro/software-agent-sdk/openhands-workspace",
    "/xxxpath/pro/software-agent-sdk/openhands-agent-server"
  ],
  "exclude": [
    ".venv/**",
    "**/__pycache__",
    "**/.pytest_cache"
  ],
  "executionEnvironments": [
    {
      "root": "."
    }
  ]
}
总访客数:   ·   总访问量:
PLM's Blog @ 2016 - 2026