docker Makefile命令从未满足

bxjv4tth  于 2023-05-28  发布在  Docker
关注(0)|答案(1)|浏览(146)

我有以下项目结构:

| .
| ..
| 
| Makefile
| a
  | .
  | ..
  | Dockerfile
  \ Makefile
\ b
  | .
  | ..
  | Dockerfile
  \ Makefile

a/Makefile:

all:
<TAB>docker build -t a-image .

B/Makefile:

all:
<TAB>docker build -t b-image .

B/Dockerfile:

FROM a-image
...

Makefile:

all: a b

a:
<TAB>make -C a/ all

b: a
<TAB>make -C b/ all

由于某些原因,当我在项目的根目录下运行make all时,我从未构建a,并且在构建b时收到错误,因为它依赖于a

...
pull access denied for a-image, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
...

我做错了什么?

uoifb46i

uoifb46i1#

Make的主要操作模式是围绕 files。你的Makefile说,如果一个文件a不存在,这里有创建它的规则;如果b不存在,a必须(必要时构建它),下面是创建它的规则。
但是,在您的示例中,ab都是存在于磁盘上的目录。Make能够查看磁盘并说“一个名为a的文件系统条目已经存在”,并跳过相应的规则。
如果您正在使用GNU Make,并且只是尝试将Make用作脚本运行器而不是构建系统,则可以将目录规则声明为.PHONY。这将导致Make忽略文件已经存在的事实,并始终认为这些规则已过期。

# in the top-level Makefile, anywhere, unindented
.PHONY: a b

我可能会建议更好的方法是采用Make的面向文件的模型。无论何时你做了什么,确保你创建了一个文件,并使用touch(1)更新了它的时间戳,以记录这一事实。例如,在a/Makefile中,可以使用sentinel文件来记录映像构建

.PHONY: all
all: .docker-build

.docker-build: Dockerfile
        docker build -t a-image .
        touch "$@"

现在在父Makefile中,您知道make -C a将创建a/.docker-build,您可以将其用作依赖项目标。

.PHONY: all
all: b/.docker-build

a/.docker-build:
        $(MAKE) -C a

b/.docker-build: a/.docker-build
        $(MAKE) -C b

如果你删除了.PHONY行,这将适用于任何Make实现。

相关问题