我正在嘗試從 Makefile 中獲取最新的 docker build ID,我創建了一些 Make,如下所示
service-develop:
$(MAKE) build
$(eval IMAGE=$(shell docker images --format='{{.ID}}' | head -1))
docker network inspect $(DOCKER_NETWORK) >/dev/null 2>&1 || docker network create $(DOCKER_NETWORK)
docker run -td --name $(PROJECT_NAME)-rfs --network-alias rfs --network=$(DOCKER_NETWORK) \
-v ${PWD}/packages/${NAME}/python:/var/opt/ncs/packages/${NAME}/python \
-v ${PWD}/packages/${NAME}/templates:/var/opt/ncs/packages/${NAME}/templates \
$(IMAGE)
在$(MAKE) build創建一些 docker 鏡像期間,我嘗試獲取最新的構建 ID 并將其分配給 IMAGE 變數,$(eval IMAGE=$(shell docker images --format='{{.ID}}' | head -1))但是接下來會發生什么,最新的 docker 鏡像 - dcd6599dee08
Step 12/12 : COPY extra-files /
---> dcd6599dee08
Successfully built dcd6599dee08
Successfully tagged package-1/nso:5.4.1.1-ubuntu
我也可以在我的輸出中看到它
ubuntu@mgmt:~$ docker images | head -5
REPOSITORY TAG IMAGE ID CREATED SIZE
package-1/nso 5.4.1.1-ubuntu dcd6599dee08 7 minutes ago 567MB
package-1/build 5.4.1.1-ubuntu df61a9396715 7 minutes ago 1.36GB
<none> <none> ace2ec32bd29 10 minutes ago 567MB
<none> <none> 4ca01c690857 10 minutes ago 1.36GB
ubuntu@mgmt:~$ docker images --format='{{.ID}}' | head -1
dcd6599dee08
不幸的是 IMAGE 變數不是來自 docker 影像輸出的第一個而是第三個條目
docker run -td --name package-1-rfs --network-alias rfs --network=bridge-net-ubuntu \
-v /home/ubuntu/package-1/packages/underlay/python:/var/opt/ncs/packages/underlay/python \
-v /home/ubuntu/package-1/packages/underlay/templates:/var/opt/ncs/packages/underlay/templates \
**ace2ec32bd29**
有什么想法嗎?
uj5u.com熱心網友回復:
您幾乎可以docker build -t在每個docker命令中直接使用 Docker 映像名稱(選項)。如果您知道完整的影像名稱,則無需查找 ID。如果我在這里使用 Make,我會在 Make 變數中指定該名稱。
REPOSITORY := docker.io
IMAGE := package-1/nso
TAG := nso:5.4.1.1-ubuntu
DOCKER_IMAGE := $(REPOSITORY)/$(IMAGE):$(TAG)
DOCKER_NETWORK := some-network
build:
docker build -t $(DOCKER_IMAGE) .
network:
docker network inspect $(DOCKER_NETWORK) >/dev/null 2>&1 || docker network create $(DOCKER_NETWORK)
service: build network
docker run -d \
--name $(PROJECT_NAME)-rfs \
--network-alias rfs \
--network=$(DOCKER_NETWORK) \
$(DOCKER_IMAGE)
您應該很少需要 GNU Make$(shell ...)擴展,而且我知道某些 Make 函式會在您預期之外的時間擴展(我無法立即找到陳述句 if$(eval $(shell ...))將在規則執行之前或期間運行)。您在這里不需要它,因為您已經知道影像名稱和標簽。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/403818.html
標籤:
