我有以下项目结构:
| .
| ..
|
| 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
...
我做错了什么?
1条答案
按热度按时间uoifb46i1#
Make的主要操作模式是围绕 files。你的Makefile说,如果一个文件
a
不存在,这里有创建它的规则;如果b
不存在,a
必须(必要时构建它),下面是创建它的规则。但是,在您的示例中,
a
和b
都是存在于磁盘上的目录。Make能够查看磁盘并说“一个名为a
的文件系统条目已经存在”,并跳过相应的规则。如果您正在使用GNU Make,并且只是尝试将Make用作脚本运行器而不是构建系统,则可以将目录规则声明为
.PHONY
。这将导致Make忽略文件已经存在的事实,并始终认为这些规则已过期。我可能会建议更好的方法是采用Make的面向文件的模型。无论何时你做了什么,确保你创建了一个文件,并使用touch(1)更新了它的时间戳,以记录这一事实。例如,在
a/Makefile
中,可以使用sentinel文件来记录映像构建现在在父Makefile中,您知道
make -C a
将创建a/.docker-build
,您可以将其用作依赖项目标。如果你删除了
.PHONY
行,这将适用于任何Make实现。