在sed正则表达式中使用docker-build arg



作为Dockerfile构建的一部分,我正在尝试使用sed来替换package.json文件的部分内容。以下命令来自常规linux命令行(在我的主机上(:

export GITHUB_TOKEN=MySecretToken && sed -i -E "s/git+ssh://git/git+https://${GITHUB_TOKEN}:/g" package.json

这很好用,而且很管用。然后我试着在dockerfile中做同样的事情:

ARG TOKEN
RUN export GITHUB_TOKEN=$TOKEN && sed -i -E "s/git+ssh://git/git+https://${GITHUB_TOKEN}:/g" package.json

然后当我构建它时:$docker build--build arg TOKEN=MySecretToken。

它失败,并显示以下错误消息:sed:-e表达式#1,字符42:"s"的未知选项

所有帮助感谢

最终编辑:当前状态我仍然无法在主机上使用docker使其工作,但我尝试了GCP vm,它实际上可以正常工作。在我的linux vm和windows机器之间可能存在一些与复制粘贴相关的问题。很抱歉,如果是这样的话,我很感激你的回答和评论。

编辑:我对这种方法的安全性有一些担忧,所以我将尝试澄清:

我的意思是在构建时插入这个令牌,而不是在运行时。原因是我们在我们的package.json中使用了私有的git repos来获得dependencies。要在不在构建容器中设置git的情况下安装这些,我们可以使用github部署令牌。我们计划使用Google Cloud Build进行构建,并加密此令牌。在构建过程中(在相同的构建步骤中(,我们计划:

  • 复制原始包.json
  • 解密令牌
  • 使用sed将package.json的一部分替换为解密的令牌
  • 运行npm安装
  • 将被篡改的package.json替换为原始package.jsn

这也是多级构建中第一个构建步骤的一部分。最终的映像(及其docker历史记录(将只包含已编译的应用程序,不包含任何构建时依赖项(如源代码目录package.json(,也不包含任何令牌的痕迹(既不加密也不解密(。

有关类似方法的博客文章,请参阅https://medium.com/@kevinsimper/how-we-do-docker-multi-stage-builds-and-secure-sharing of private-repositories-956eda84f3b8

ARG用于在构建时传递参数,例如:

docker build -t mydocker 
--build-arg TOKEN=MySecretToken .

我假设你想在图像启动时传递该令牌,所以你应该将参数作为环境参数传递,这样你就可以重用同一个容器,但传递不同的令牌。还将令牌注入entrypoint.sh 中的package.json中

docker run -d --rm --name mydoc -e GITHUB_TOKEN=MySecretToken mydocker

通过这种方式,GITHUB_TOKEN将成为环境变量的一部分,这很好。

当然,在entrypoint.sh中,您可以进行替换:

#!/bin/bash
sed -i -E "s/git+ssh://git/git+https://${GITHUB_TOKEN}:/g" package.json
...

我的建议是根本不传递该令牌,我假设您计划在容器内运行npm install,并在其他容器(缓存容器(中生成node_modules,并将node_module文件夹复制到您的容器中。这样你就不会暴露你的代币。

最新更新