docker login 配置同一个镜像仓库登录多个账号 自动切换对应配置
脚本适用范围:
- 同一个镜像仓库配置多个账号登录
- 多个账号在
pull
和push
时镜像URL
包含配置名 (有统一规则) - 不符合第二条的可根据实际情况修改脚本
前提:已知 image_url
格式为 url/PROJECT_NAME/image_name:tag
1、使用 --config
选项 先登录多个账号
# 登录第一个账号
docker --config ~/.docker/PROJECT_NAME1 login registry.example.com
# 登录第二个账号
docker --config ~/.docker/PROJECT_NAME1 login registry.example.com
2、当你不想后面继续时 这里就可以使用了,使用命令格式为
# 需要对哪个账户的镜像做操作就指定哪个配置
docker --config ~/.docker/PROJECT_NAME1 pull registry.example.com/my-image
docker --config ~/.docker/PROJECT_NAME1 push registry.example.com/my-image
3、当你觉得这个命令记不住,可继续下面的操作 将 这个命令做个脚本
注:这里只针对 pull 需要的话自己改一下 需要更完善的 继续往下看
3.1 将脚本保存为 docker_pull.sh
。
#!/bin/bash
# 检查是否提供了镜像URL
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <image_url>"
exit 1
fi
IMAGE_URL=$1
# 从镜像URL中提取项目名
PROJECT_NAME=$(echo "$IMAGE_URL" | awk -F '/' '{print $2}')
# 构造配置路径
CONFIG_PATH="$HOME/.docker/$PROJECT_NAME"
# 执行 docker pull 命令,根据配置路径是否存在来决定是否使用 --config 参数
if [ -d "$CONFIG_PATH" ]; then
echo "Using config at $CONFIG_PATH"
docker --config "$CONFIG_PATH" pull "$IMAGE_URL"
else
echo "Config path '$CONFIG_PATH' not found. Using default Docker config."
docker pull "$IMAGE_URL"
fi
# 检查 docker pull 命令是否成功
if [ $? -eq 0 ]; then
echo "Successfully pulled $IMAGE_URL"
else
echo "Failed to pull $IMAGE_URL"
exit 1
fi
3.2 给脚本赋予执行权限:
chmod +x docker_pull.sh
3.3 像使用 docker pull image_url
一样执行该脚本:
./docker_pull.sh url/项目名/image_name:tag
4、执行时不用脚本执行 还用 docker pull
和 docker push
4.1 创建一个名为 docker_pull_push.sh
的脚本,负责处理 docker pull
和 docker push
命令的逻辑
#!/bin/bash
COMMAND=$1
IMAGE_URL=$2
# 从镜像URL中提取项目名
PROJECT_NAME=$(echo "$IMAGE_URL" | awk -F '/' '{print $2}')
# 构造配置路径
CONFIG_PATH="$HOME/.docker/$PROJECT_NAME"
# 执行 docker pull 或 docker push 命令,根据配置路径是否存在来决定是否使用 --config 参数
if [ -d "$CONFIG_PATH" ]; then
echo "Using config at $CONFIG_PATH"
docker --config "$CONFIG_PATH" "$COMMAND" "$IMAGE_URL"
else
echo "Config path '$CONFIG_PATH' not found. Using default Docker config."
docker "$COMMAND" "$IMAGE_URL"
fi
# 检查命令是否成功
if [ $? -eq 0 ]; then
echo "Successfully executed $COMMAND $IMAGE_URL"
else
echo "Failed to execute $COMMAND $IMAGE_URL"
exit 1
fi
4.2 重新定义 docker
函数,执行 docker pull 和 docker push 且 只有一个 image_url
参数的命令时调用脚本, 其它命令不影响
4.2.1 定义函数
-
打开
~/.bashrc
或~/.zshrc
文件:nano ~/.bashrc # 如果你使用 Bash # 或 nano ~/.zshrc # 如果你使用 Zsh
-
添加函数
docker() { if [[ "$1" = "pull" || "$1" = "push" ]] && [ "$#" -eq 2 ]; then # 这里 用你的 脚本路径替换掉 /path/to/docker_pull_push.sh "$1" "$2" else command docker "$@" fi }
4.3 使用步骤
-
将上面的 Bash 函数添加到
~/.bashrc
或~/.zshrc
中 -
创建
docker_pull_push.sh
脚本,并将其放在你指定的路径(确保路径与上面的函数中一致) -
给脚本赋予执行权限
chmod +x /path/to/docker_pull_push.sh
-
重新加载
~/.bashrc
或~/.zshrc
文件:source ~/.bashrc # 或 ~/.zshrc
-
命令使用不受影响 如:
# 拉取镜像 docker pull url/PROJECTNAME/image_name:tag # 推送镜像 docker push url/PROJECTNAME/image_name:tag
5、脚本工作原理
- 当你输入
docker pull image_url
或docker push image_url
时,函数会调用你的docker_pull_push.sh
脚本。 - 脚本会检查项目名对应的配置路径是否存在,并根据是否存在来决定是否使用
--config
参数。 - 对于其他
docker
命令(如docker run
或docker build
),或多于一个参数的pull
和push
命令,原始的docker
命令将被直接执行,不会受到影响。