我成功地在 AWS CodeBuild 中使用非根用户。
要提出实用的解决方案,需要的不仅仅是了解一些 CodeBuild 选项。
每个人都应该发现run-as
option 很容易 https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html.
下一个问题是“哪个用户?”;您不能只输入任何单词作为用户名。
为了找出哪些用户可用,下一条线索位于CodeBuild 提供的 Docker 镜像 https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-available.html部分。在那里,您将找到每个图像定义的链接。
对我来说,该链接引导我到GitHub 上的此页面 https://github.com/aws/aws-codebuild-docker-images/tree/master/ubuntu/standard/4.0
检查了源代码后Dockerfile
,我们就会知道有一个名为codebuild-user
可用的。我们可以用这个codebuild-user
为了我们的run-as
在构建规范中。
然后我们将面临很多其他问题,因为标准映像仅安装每种语言的运行时root
仅有的。
这是一般性的解释所能达到的程度。
对于我来说,我想使用 Ruby 运行时,所以我唯一关心的是 Ruby 运行时。
如果您将 CodeBuild 用于其他用途,那么您现在就得靠自己了。
为了利用 Ruby 运行时codebuild-user
,我们必须从 root 用户公开它们。为此,我更改了所需的权限和所有者.rbenv
由 CodeBuild 映像通过以下命令使用。
chmod +x ~
chown -R codebuild-user:codebuild-user ~/.rbenv
The bundler
(Ruby的依赖管理工具)仍然想要访问主目录,该目录是不可写的。我们必须设置一个环境变量以使其使用其他可写位置作为主目录。
环境变量是BUNDLE_USER_HOME
.
把所有东西放在一起;我的构建规范如下所示:
version: 0.2
env:
variables:
RAILS_ENV: test
BUNDLE_USER_HOME: /tmp/bundle-user
BUNDLE_SILENCE_ROOT_WARNING: true
run-as: codebuild-user
phases:
install:
runtime-versions:
ruby: 2.x
run-as: root
commands:
- chmod +x ~
- chown -R codebuild-user:codebuild-user ~/.rbenv
- bundle config set path 'vendor/bundle'
- bundle install
build:
commands:
- bundle exec rails spec
cache:
paths:
- vendor/bundle/**/*
我的观点是:
- 这确实是可能的。
- 展示我是如何针对我的用例做到这一点的。