首页 > 解决方案 > AWS 代码管道,dockerfile 无法访问环境变量 CODEBUILD_SRC_DIR 和 CODEBUILD_SRC_DIR_SecondarySource

问题描述

我正在使用 aws 代码管道。我有 2 个 codecommit repo 说 source1 和 source2。我正在为 CI/CD 使用代码管道。

我创建的 Codepipeline 在 codepipeline 的源代码中同时使用了 codecommit repo 即source1source2。现在 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_DIRCODEBUILD_SRC_DIR_source2 环境变量。

任何人都知道如何在 dockerfile 中访问CODEBUILD_SRC_DIR_source2source2以便我可以将它们复制到容器中并使代码构建成功。

提前致谢 !!!

标签: amazon-web-servicesdockerdockerfileaws-codepipelineaws-codebuild

解决方案


为面临相同问题的其他人添加答案。希望这会对某人有所帮助!

问题是当只有一个 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

它奏效了!


推荐阅读