当前位置: 首页 > 知识库问答 >
问题:

AWS代码构建为非根用户

麹正业
2023-03-14

有没有办法在AWS CodeBuild上删除root用户?我们正在构建一个Yocto项目,如果我们是root(Bitbake健全性检查),它在代码构建上会失败。

我们不顾一切的方法也不起作用:

...

build:
  commands:
    - chmod -R 777 $(pwd)/ && chown -R builder $(pwd)/ && su -c "$(pwd)/make.sh" -s /bin/bash builder
...

在以下情况下失败:

bash: /codebuild/output/src624711770/src/.../make.sh: Permission denied

你知道我们怎么把它变成非根的吗?

共有3个答案

栾烨华
2023-03-14

我们最终做了以下工作:

创建一个Dockerfile,其中包含构建Yocto/Bitbake项目的所有内容,在该项目中,我们添加所需的源代码,并创建一个用于构建项目的用户builder

  FROM ubuntu:16.04

  RUN apt-get update && apt-get -y upgrade

  # Required Packages for the Host Development System
  RUN apt-get install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \
       build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
       xz-utils debianutils iputils-ping vim

  # Additional host packages required by poky/scripts/wic
  RUN apt-get install -y curl dosfstools mtools parted syslinux tree

  # Create a non-root user that will perform the actual build
  RUN id builder 2>/dev/null || useradd --uid 30000 --create-home builder
  RUN apt-get install -y sudo
  RUN echo "builder ALL=(ALL) NOPASSWD: ALL" | tee -a /etc/sudoers

  # Fix error "Please use a locale setting which supports utf-8."
  # See https://wiki.yoctoproject.org/wiki/TipsAndTricks/ResolvingLocaleIssues
  RUN apt-get install -y locales
  RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
          echo 'LANG="en_US.UTF-8"'>/etc/default/locale && \
          dpkg-reconfigure --frontend=noninteractive locales && \
          update-locale LANG=en_US.UTF-8

  ENV LC_ALL en_US.UTF-8
  ENV LANG US.UTF-8
  ENV LANGUAGE en_US.UTF-8

  WORKDIR /home/builder/
  ADD ./ ./

  USER builder

  ENTRYPOINT ["/bin/bash", "-c", "./make.sh"]

我们在Codebuildpre_build步骤中构建这个docker,并在运行映像时在ENTRYPOINT(在make.sh)中运行实际构建。容器被激活后,我们将工件复制到Codebuild主机并将其放在S3上:

version: 0.2

phases:
  pre_build:
    commands:
      - mkdir ./images
      - docker build -t bob .
  build:
    commands:
      - docker run bob:latest
  post_build:
    commands:
      # copy the last excited container's images into host as build artifact
      - docker cp $(docker container ls -a | head -2 | tail -1 | awk '{ print $1 }'):/home/builder/yocto-env/build/tmp/deploy/images ./images
      - tar -cvzf artifacts.tar.gz ./images/*
artifacts:
  files:
    - artifacts.tar.gz

这种方法的唯一缺点是,我们不能(容易地)使用Codebuild的缓存功能。但是构建对我们来说足够快,因为我们白天进行本地构建,晚上基本上从头开始重建,这需要大约90分钟(在最强大的Codebuild实例上)。

彭坚壁
2023-03-14

要以非根用户身份运行CodeBuild,需要在buildspec中使用run-as标记指定Linux用户名。yaml如文件所示

version: 0.2

run-as: Linux-user-name

env:
  variables:
   key: "value"
   key: "value"
parameter-store:
key: "value"
key: "value"

phases:
  install:
  run-as: Linux-user-name
  runtime-versions:
    runtime: version
马新觉
2023-03-14

感谢您的此功能请求。目前,您无法在CodeBuild中以非root用户身份运行,我已将其传递给团队进行进一步审查。非常感谢您的反馈。

 类似资料:
  • 我开始学习AWS的CI/CD功能。到目前为止,我一直在基于microsoft/windowsservercore映像在Windows Server 2016本地创建docker映像,并手动将其推送到ECR(amazon容器注册表)。 在这一点上,我没有试图在CodeBuild中编译应用程序。我只是想建造容器。在本地,二进制文件位于子目录中,并复制到容器中。 CodeBuild项目失败,出现错误:无

  • 我创建了一个AWS代码管道,它分四个阶段运行。1) 来自github的源代码,2)将后端部署到Elastic Beanstalk,3)使用Codebuild构建前端代码(使用下面的buildspec文件),以及4)将webpack的结果部署到S3。 到目前为止,除了第三阶段的结果外,一切都按预期进行。Codebuild似乎将工件设置为源文件,而不是webpack构建的结果。在bucket和文件夹中

  • 我正在尝试使用代码构建操作在AWS代码管道上部署AWS CDK应用程序。 构建和部署在本地完美工作(因为它会!)但是在CodeBuild上运行时,命令失败 这很可能是一些琐碎的事情,但我却在挠头,想弄明白是什么! 项目结构是自动生成的(使用) 对于阶段是 是(此阶段的输入目录是阶段的工件,即目录) 阶段抛出cdk ls步骤中的错误。由于上面的构建/部署步骤在本地工作(在干净的签出中),我怀疑这可能

  • 我在一个AWS代码构建项目中运行了一些使用Boto3的Python(如果需要的话,作为代码管道中的一个阶段)。然而,我注意到它运行的是Boto3的旧版本,它没有我需要的一些功能。如何获取CodeBuild以安装新版本? 我的构建规范目前有这一行,但它默认为旧版本。

  • Your browser does not support the video tag.

  • 14. 构建代码 Spring Boot并不要求任何特殊的代码布局,然而,存在一些有用的最佳实践。 14.1 使用“default”包 如果一个类没有声明包,则认为这个类位于“默认包”中。通常不鼓励使用“默认包”,应当避免使用它。对于使用了@ComponentScan、@EntityScan或@SpringBootApplication注解的Spring Boot程序,“默认包”可能会导致特殊问题