我已经成功地在AWS CodeBuild中使用非root用户。
要想得出一个实用的解决方案,需要比仅仅了解一些CodeBuild选项更多的内容。
每个人都应该很容易地找到run-as
选项。
下一个问题是“哪个用户?”; 你不能随便输入任何单词作为用户名。
为了找出哪些用户可用,下一个线索可以在CodeBuild提供的Docker映像 部分找到。
在那里,你会找到到每个图像定义的链接。
对于我来说,这个链接把我带到GitHub上的这个页面
检查Dockerfile
的源代码后,我们会知道有一个名为codebuild-user
的用户是可用的。 我们可以在构建规范中使用此codebuild-user
作为run-as
。
然后我们将面对许多其他问题,因为标准图像仅为root
安装每种语言的运行时。
这就是通用解释的限制所在。
对于我来说,我想使用Ruby运行时,因此我的唯一问题是Ruby运行时。
如果你将CodeBuild用于其他事情,现在就自己解决吧。
为了将Ruby运行时作为codebuild-user
利用起来,我们必须从root用户中把它们暴露出来。为此,我使用以下命令更改了CodeBuild映像使用的.rbenv
所需的权限和所有者。
chmod +x ~
chown -R codebuild-user:codebuild-user ~/.rbenv
bundler
(Ruby的依赖管理工具)仍然需要访问主目录,而该目录不可写。我们必须设置一个环境变量,使其使用其他可写目录作为主目录。
该环境变量为BUNDLE_USER_HOME
。
将所有内容组合在一起,我的buildspec
如下:
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/**/*
我的观点是:
- 确实有可能。
- 展示我是如何在我的使用案例中实现的。