簡體   English   中英

如何使用本地圖像作為 dockerfile 的基礎圖像?

[英]How can I use a local image as the base image with a dockerfile?

我正在研究 dockerfile。我剛剛意識到我一直在使用FROM和索引圖像。

所以我想知道:

  • 如何在不將其pushing送到索引的情況下使用我的本地(自定義)圖像之一作為我的基礎( FROM )圖像?

您可以使用它而無需做任何特別的事情。 如果您有一個名為blah的本地圖像,您可以執行FROM blah 如果您在 Dockerfile 中執行FROM blah ,但沒有名為blah的本地映像,Docker 將嘗試從注冊表中提取它。

換句話說,如果一個 Dockerfile 確實是FROM ubuntu ,但你有一個名為ubuntu的本地鏡像與官方鏡像不同,你的鏡像將覆蓋它。

對於將來遇到此問題的任何人,如果您在本地有圖像,但docker build仍然嘗試從 docker hub 提取圖像,問題可能是架構類型不同。

即使圖像存在,也嘗試從 docker.io 中提取

您可以使用檢查圖像的架構

docker inspect --format='{{.Os}}/{{.Architecture}}' IMAGE_NAME

現在在您的Dockerfile FROM IMAGE_NAME更改為FROM --platform=linux/amd64 IMAGE_NAME類的東西,docker 現在將使用本地圖像。

已驗證:它在 Docker 1.7.0 中運行良好。

運行 docker docker build命令時不要指定--pull=true

從這個線程上使用 FROM at dockerfile 參考本地構建的圖像

如果你想使用本地鏡像作為基礎鏡像,不帶選項--pull=true傳遞
--pull=true將始終嘗試拉取更新版本的圖像。

您可以在圖像中包含 - 字符。 假設您有一個名為 centos-base-image 且標簽為 7.3.1611 的本地映像(不是本地注冊表)。

docker version 
      Client:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4

      Server:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4

docker images
 REPOSITORY            TAG
 centos-base-image     7.3.1611

Dockerfile

FROM centos-base-image:7.3.1611
RUN yum -y install epel-release libaio bc flex

結果

Sending build context to Docker daemon 315.9 MB
Step 1 : FROM centos-base-image:7.3.1611
  ---> c4d84e86782e
Step 2 : RUN yum -y install epel-release libaio bc flex
  ---> Running in 36d8abd0dad9
...

在上面的示例中, FROM正在獲取您的本地圖像,您可以提供額外的指令來從您的自定義注冊表中獲取圖像(例如FROM localhost:5000/my-image:with.tag )。 請參閱https://docs.docker.com/engine/reference/commandline/pull/#pull-from-a-different-registryhttps://docs.docker.com/registry/#tldr

最后,如果您的圖像在提供名稱時沒有被解析,請嘗試在創建圖像時為其添加標簽

這個 GitHub 線程描述了一個類似的問題,即沒有按名稱查找本地圖像

通過省略特定標簽,docker 將查找標記為“最新”的圖像,因此要么使用 :latest 標簽創建圖像,要么更改您的 FROM

請記住,不僅要放置標簽,還要放置該標簽所在的存儲庫,這樣:

docker images
REPOSITORY                                TAG                       IMAGE ID            CREATED             SIZE
elixir                                    1.7-centos7_3             e15e6bf57262        20 hours ago        925MB

你應該這樣引用它:

elixir:1.7-centos7_3

我必須在帶有 M1 的 Mac 上禁用BUILDKIT才能使用本地圖像。 您可以通過將DOCKER_BUILDKIT環境變量設置為 0 來實現。

DOCKER_BUILDKIT=0 docker build -t YOUR_TAG --pull=false.

對於使用 M1 芯片的用戶,當本地鏡像的平台不同與目標 Dockerfile 不同時,可能會出現問題。 就我而言,我已經構建了支持 M1 的基本映像,然后嘗試在使用平台linux/amd64構建的映像中使用命令FROM

我們的/etc/docker/daemon.json有一行聲明

"disable-legacy-registry" : true,

使用該行,本地注冊表拒絕訪問。
刪除它后,它就可以工作了。

我剛剛在引擎版本為 20.10.14 的 M1 Mac 上遇到了這個問題。 從 docker docker build --help看並不明顯,但傳遞--pull=false對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM