Makefile 获取最后 docker 构建
Makefile get last docker build
我正在尝试从 Makefile 中获取最新的 docker 构建 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**
有什么想法吗?
您几乎可以在每个 docker
命令中直接使用 Docker 图像名称(docker build -t
选项)。如果您知道完整的图像名称,则永远不需要查找 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 功能有时会在你期望的时候扩展(如果 [=14= 我无法立即找到声明] 将在规则执行之前或期间获得 运行)。您在这里不需要它,因为您已经知道图像名称和标签。
我正在尝试从 Makefile 中获取最新的 docker 构建 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**
有什么想法吗?
您几乎可以在每个 docker
命令中直接使用 Docker 图像名称(docker build -t
选项)。如果您知道完整的图像名称,则永远不需要查找 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 功能有时会在你期望的时候扩展(如果 [=14= 我无法立即找到声明] 将在规则执行之前或期间获得 运行)。您在这里不需要它,因为您已经知道图像名称和标签。