无法在 AWS CodeBuild 图像中使用 amazon-linux-extras
Cannot use amazon-linux-extras in AWS CodeBuild image
我的 CDK 堆栈使用以下 CodeBuild 项目定义了一个 CodePipeline:
project_build = codebuild.Project(self, "ProjectBuild",
project_name = "Build",
source = github_source,
environment = codebuild.BuildEnvironment(
build_image = codebuild.LinuxBuildImage.AMAZON_LINUX_2_2,
privileged = True),
environment_variables = { … },
build_spec = codebuild.BuildSpec.from_source_filename("cdk/buildspec/build.yml"))
我正在使用 Amazon Linux 2 映像,并想在上面安装 PostgreSQL,所以我制作了这个简单的构建规范测试文件:
version: 0.2
phases:
install:
commands:
- amazon-linux-extras install postgresql13
build:
commands:
- echo "foo"
这是作业引发的错误:
[Container] 2021/10/12 16:50:32 Entering phase INSTALL
[Container] 2021/10/12 16:50:32 Running command amazon-linux-extras
/root/.pyenv/versions/3.8.10/bin/python: No module named amazon_linux_extras
[Container] 2021/10/12 16:50:34 Command did not exit successfully amazon-linux-extras exit status 1
[Container] 2021/10/12 16:50:34 Phase complete: INSTALL State: FAILED
[Container] 2021/10/12 16:50:34 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: amazon-linux-extras. Reason: exit status 1
我不明白为什么 amazon-linux-extras
会 运行 作为 Python 模块。我试过 /usr/bin/amazon-linux-extras
绝对路径但没有取得更好的成功。
我在 Amazon Linux 实例上直接使用 amazon-linux-extras
从未遇到过任何问题,但我应该如何在 CodeBuild 上下文中使用它?
尽管它是一个 AWS Linux 实例,但许多 aws 的东西并没有预先安装在 CodeBuild 标准映像上。您通常必须安装它——比如 CDK 或其他。在尝试调用它之前尝试 yum install -y amazon-linux-extras
。
这个错误好像是因为亚马逊Linux2使用Python2.7而pyenv环境使用Python3.
CodeBuild好像一直在用pyenv。因此 amazon-linux-extras 命令将通过创建一个符号 link 来工作,如下所示。
ln -s /lib/python2.7/site-packages/amazon_linux_extras ~/.pyenv/versions/3.8.10/lib/python3.7/site-packages/
看来 amazon-linux-extras
脚本只能与 Python 2 一起使用,并且正在使用 python
可执行文件。
我需要像这样为我的命令添加前缀,以确保使用 python2
可执行文件:
version: 0.2
phases:
install:
commands:
- PYTHON=python2 amazon-linux-extras enable postgresql13
- yum clean metadata
- yum install postgresql
build:
commands:
- echo "foo"
我的 CDK 堆栈使用以下 CodeBuild 项目定义了一个 CodePipeline:
project_build = codebuild.Project(self, "ProjectBuild",
project_name = "Build",
source = github_source,
environment = codebuild.BuildEnvironment(
build_image = codebuild.LinuxBuildImage.AMAZON_LINUX_2_2,
privileged = True),
environment_variables = { … },
build_spec = codebuild.BuildSpec.from_source_filename("cdk/buildspec/build.yml"))
我正在使用 Amazon Linux 2 映像,并想在上面安装 PostgreSQL,所以我制作了这个简单的构建规范测试文件:
version: 0.2
phases:
install:
commands:
- amazon-linux-extras install postgresql13
build:
commands:
- echo "foo"
这是作业引发的错误:
[Container] 2021/10/12 16:50:32 Entering phase INSTALL
[Container] 2021/10/12 16:50:32 Running command amazon-linux-extras
/root/.pyenv/versions/3.8.10/bin/python: No module named amazon_linux_extras
[Container] 2021/10/12 16:50:34 Command did not exit successfully amazon-linux-extras exit status 1
[Container] 2021/10/12 16:50:34 Phase complete: INSTALL State: FAILED
[Container] 2021/10/12 16:50:34 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: amazon-linux-extras. Reason: exit status 1
我不明白为什么 amazon-linux-extras
会 运行 作为 Python 模块。我试过 /usr/bin/amazon-linux-extras
绝对路径但没有取得更好的成功。
我在 Amazon Linux 实例上直接使用 amazon-linux-extras
从未遇到过任何问题,但我应该如何在 CodeBuild 上下文中使用它?
尽管它是一个 AWS Linux 实例,但许多 aws 的东西并没有预先安装在 CodeBuild 标准映像上。您通常必须安装它——比如 CDK 或其他。在尝试调用它之前尝试 yum install -y amazon-linux-extras
。
这个错误好像是因为亚马逊Linux2使用Python2.7而pyenv环境使用Python3.
CodeBuild好像一直在用pyenv。因此 amazon-linux-extras 命令将通过创建一个符号 link 来工作,如下所示。
ln -s /lib/python2.7/site-packages/amazon_linux_extras ~/.pyenv/versions/3.8.10/lib/python3.7/site-packages/
看来 amazon-linux-extras
脚本只能与 Python 2 一起使用,并且正在使用 python
可执行文件。
我需要像这样为我的命令添加前缀,以确保使用 python2
可执行文件:
version: 0.2
phases:
install:
commands:
- PYTHON=python2 amazon-linux-extras enable postgresql13
- yum clean metadata
- yum install postgresql
build:
commands:
- echo "foo"