一些鏡像會在它打鏡像時,加入一些默認的啟動命令,可以通過docker inspect \<image id\>
來查看Entrypoint
。如下圖,docker run啟動時,會默認執行 "python3 -m vllm.entrypoints.openai.api_server"
如果不想執行,有幾個辦法:
(1)在 docker run 命令中直接覆蓋默認的啟動腳本
# 覆蓋 CMD
docker run --rm -it your_image sh # 用 `sh` 替換原有 CMD 命令
# 覆蓋 ENTRYPOINT
docker run --rm -it --entrypoint "" your_image sh # 清空 ENTRYPOINT 并運行新命令
–entrypoint “”:清空原鏡像的 ENTRYPOINT。
覆蓋優先級:docker run 的命令行參數優先級高于 Dockerfile 中的 CMD 和 ENTRYPOINT。使用 docker run -it --entrypoint sh your_image 可快速進入容器 Shell,繞過啟動腳本。
(2)基于上述鏡像,重新打一個entrypoint為空的鏡像
基于上述–entrypoint ""啟動的容器,docker inspect <container_id>可以看到這個容器是沒有啟動命令的,可以基于此容器重新打個鏡像
# 提交容器為新的鏡像,同時清除 ENTRYPOINT
docker commit \--change "ENTRYPOINT " \ # 顯式清空 ENTRYPOINTtemp_container your_new_image:no-entrypoint
--change "CMD="
有需要也可以情況CMD
https://blog.csdn.net/pengjian444/article/details/105471450
在(1)中使用 --entrypoint “” 啟動后,可以直接把那個啟動的容器docker commit一下,就得到了一個entrypoint位空的鏡像
(3)直接修改鏡像底層數據
導出原始鏡像為 tar 文件:
docker save -o original_image.tar your_original_image:tag
解壓 tar 文件并修改元數據:
mkdir extracted_image
tar -xf original_image.tar -C extracted_image
cd extracted_image
找到并修改配置文件:
每個鏡像層的元數據存儲在 manifest.json 和各層的 json 文件(如 xxxxxxxx.json)。
編輯主配置文件(通常是第一個層的 json 文件),找到 config.Entrypoint 字段并設為 null 或刪除:
json
{"config": {"Entrypoint": null, // 清空 Entrypoint"Cmd": ["原有CMD命令"] // 可選:保留或修改 CMD}
}
重新打包并導入鏡像:
# 重新打包為 tar
tar -cf ../new_image.tar *
cd ..
# 導入新鏡像
docker load -i new_image.tar
# 檢查新鏡像名稱和標簽
docker images