0

我有工作的 docker 镜像,我可以通过命令在本地运行

docker run --rm -u $(id -u) -v${PWD}:${PWD} -w${PWD} protocbuilder:1.0 [other unimportant args]

一切正常。我想使用 makefile 使用该容器自动执行操作,所以我创建了 make 命令:

test:
    docker run --rm -u $(id -u) -v${PWD}:${PWD} -w${PWD} protocbuilder:1.0 [other unimportant args]

但是当我打电话时,make test我得到以下输出:

docker run --rm -u  -v/Users/mikolaj/GolandProjects/project:/Users/mikolaj/GolandProjects/project -w/Users/mikolaj/GolandProjects/project protocbuilder:1.0 [other unimportant args]
docker: Error response from daemon: unable to find user -v/Users/mikolaj/GolandProjects/project: no matching entries in passwd file.
make: *** [test] Error 125

我不是很喜欢makefile的东西,所以我不明白为什么makefiledocker run在控制台的标准调用中会失败,一切正常。-u使用,-v-w参数将用户映射到容器似乎存在问题。我应该在 makefile 中执行一些额外的步骤以使其正常工作吗?或者,也许我需要docker run在 makefile 中更改命令中的某些内容?

提前致谢

4

1 回答 1

1

$(...)is (GNU) make 函数语法。如果您需要$在 shell 命令中包含文字以进行命令替换之类的操作,则需要通过将$

test:
    docker run --rm -u $$(id -u) ...
    #                  ^^

您还可以使用反引号语法来避免此转义问题

test:
    docker run --rm -u `id -u` ...

类似地${PWD},在命令在 shell 中运行之前通过 make 扩展,但这可能不是一个显着的区别。

于 2020-07-23T17:48:10.100 回答