【问题标题】:makefile cannot run docker image with -w -v -u optionsmakefile 无法使用 -w -v -u 选项运行 docker 映像
【发布时间】:2020-11-13 12:27:13
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: docker makefile workdir


    【解决方案1】:

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

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

    你也可以使用反引号语法来避免这个转义问题

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

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

    【讨论】:

    • 谢谢,解决了一个问题!我预计这个问题会复杂得多,真是一个惊喜:)
    • 编写 makefile 配方的简单规则是 (1) 在 shell 提示符下使其工作,(2) 将其粘贴到 make 规则配方中,(3) 替换所有 $带有$$ 的shell 命令,(4) 利润!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    相关资源
    最近更新 更多