amazon-web-services - AWS 代码管道,dockerfile 无法访问环境变量 CODEBUILD_SRC_DIR 和 CODEBUILD_SRC_DIR_SecondarySource
问题描述
我正在使用 aws 代码管道。我有 2 个 codecommit repo 说 source1 和 source2。我正在为 CI/CD 使用代码管道。
我创建的 Codepipeline 在 codepipeline 的源代码中同时使用了 codecommit repo 即source1和source2。现在 Codebuild 也在其输入工件中同时使用输入源,即 source1 和 source2。 Source1 是主要的,source2 是次要的 输入工件
我有一个buildspec.yml文件,它使用存储在source1根目录中的 dockerfile 来构建代码。
现在的问题是,dockerfile 无法在容器中复制 source2 代码。即说 source1 里面有文件夹 abc 而 source2 里面有文件夹 xyz
我在docker文件下面做
COPY ./abc /source1/abc/ --working
COPY ./xyz /source2/xyz/ --Not working,getting below error
复制失败:stat /var/lib/docker/tmp/docker-builder297252497/xyz:没有这样的文件或目录。
然后我在dockerfile中尝试了下面
COPY ./abc /source1/abc/ --working
COPY $CODEBUILD_SRC_DIR_source2/xyz /source2/xyz/ --Not working,getting same error
还尝试在 $CODEBUILD_SRC_DIR_source2 中进行 CD 并运行 COPY 命令,但同样的错误。
之后,我尝试在 yaml 和 dockerfile 中打印 PWD,CODEBUILD_SRC_DIR,CODEBUILD_SRC_DIR_source2。它产生低于输出
在 yaml 文件中
echo $CODEBUILD_SRC_DIR prints --> /codebuild/output/src886/src/s3/00
echo CODEBUILD_SRC_DIR_source2 --> /codebuild/output/src886/src/s3/01
echo $PWD --> /codebuild/output/src886/src/s3/00
在 dockerfile
echo $CODEBUILD_SRC_DIR prints --> prints nothing
echo CODEBUILD_SRC_DIR_source2 --> prints nothing
echo $PWD --> print '/'
似乎 dockerfile 无权访问CODEBUILD_SRC_DIR和CODEBUILD_SRC_DIR_source2 环境变量。
任何人都知道如何在 dockerfile 中访问CODEBUILD_SRC_DIR_source2或source2以便我可以将它们复制到容器中并使代码构建成功。
提前致谢 !!!
解决方案
为面临相同问题的其他人添加答案。希望这会对某人有所帮助!
问题是当只有一个 repo 作为输入源时传递给 docker 的构建上下文,然后 codebuild 使用此目录构建为 pwd -->CODEBUILD_SRC_DIR=/codebuild/output/src894561443/src
第一个 repo 中的源(如果只有一个 repo)存在于同一目录中,即CODEBUILD_SRC_DIR=/codebuild/output/src894561443/src
在 buildspec.yml 文件中,我们有以下命令来构建图像 docker build -t tag 。(使用第一个源的根目录中的 dockerfile)
但是当我们有多个源时,代码构建会像这样存储输入工件
CODEBUILD_SRC_DIR=/codebuild/output/src886/src/s3/00
CODEBUILD_SRC_DIR_source2=/codebuild/output/src886/src/s3/01
而不是CODEBUILD_SRC_DIR=/codebuild/output/src886/src/
CODEBUILD_SRC_DIR 是第一个输入工件(第一个 codecommit repo),而 CODEBUILD_SRC_DIR_source2 是第二个输入工件(第二个 codecommit repo)
在这种情况下,codebuild 使用的是目录 ->CODEBUILD_SRC_DIR=/codebuild/output/src886/src/s3/00 as pwd
所以下面的命令上下文被传递为点'。' (密码) docker build -t 标签。结果,只有第一个源被传递给 docker,因为 CODEBUILD_SRC_DIR 是 PWD 并且 docker 未能引用第二个源。
CODEBUILD_SRC_DIR=/codebuild/output/src886/src/s3/00 i.e /codebuild/output/src886/src/s3/
为了解决这个问题,我们像这样传递了 docker build 命令的父目录。
docker build -t tag -f $CODEBUILD_SRC_DIR/Dockerfile /codebuild/output/src886/src/s3/
并在 dockerfile 中引用了 source1 和 source2 如下
source1=./00
source2=./01
它奏效了!
推荐阅读
- typescript - 替换通用接口类型参数
- python - 使用 python 为 salesforce 生成访问令牌
- android - 如何在电池优化处于活动状态时执行后台服务
- c# - 如何从读取文件中检索到的文本和其中的新内容写入新文件
- python - Keras 中的 BCEWithLogitsLoss
- java - BigQuery 和客户端库之间的数据传输是否安全?
- python - 是否有理由从 Python 中的数字中减去零?
- c++ - 在 DirectX9 [C++] 中渲染 3D 对象的最有效方法是什么?
- maven - 服务未注册 class='interface org.eclipse.tycho.core.shared.ProxyServiceFacade'
- javascript - 搜索嵌套的对象数组并在 JavaScript 中返回完整的父对象作为结果