有没有简单的方法可以在Bitbucket Pipelines Docker容器中更改为非root用户?

雅各布·辛诺维茨(Jakub Synowiec)

Bitbucket Pipelines使用Docker容器执行任务,默认情况下,Docker容器以root身份运行。这是NPM生命周期脚本的问题,因为NPM在运行脚本时会尝试降级其特权。

当执行postinstall脚本,NPM抛出一个错误,它cannot run in wd %s %s (wd=%s)最简单的解决方案是运行带有--unsafe-perm标志的npm install ,但是我不喜欢这种方法。

Docker编写Dockerfile最佳实践指出:

如果服务可以在没有特权的情况下运行,请使用USER更改为非root用户。

在配置典型的Docker容器时,我将创建一个新的非root用户,并以该用户身份运行npm脚本。

阅读管道文档后,我找不到与Docker的USER命令等效的任何内容。我也许能使用useraddchown并且su(没有测试尚未),但有一个简单的解决方案?

不幸的是useradd脚本部分添加chownsubitbucket-pipelines.yml中断管道,并导致repo:pushwebhook失败

image: node:6.2

pipelines:
  default:
    - step:
        script:
          - useradd --user-group --create-home --shell /bin/false node
          - chown -R node: /opt/atlassian/bitbucketci/agent/build
          - su -s /bin/sh -c "npm install" node
          - su -s /bin/sh -c "npm run test:coverage --silent" node

管道回应

{
  "code": 500,
  "message": "There was an error processing your request. It has been logged (ID <removed>)."
}
雅各布·辛诺维茨(Jakub Synowiec)

我发现最舒适的解决方案是仅在映像中未包含非root用户帐户时创建该帐户,然后使用gosu实用程序为执行的命令设置该帐户

管道的build步骤已设置为chmod 777on,$BUILD_DIR因此chown不需要其他操作。

因此,要在Bitbucket Pipelines Docker容器中更改为非root用户,您必须:

  1. 在安装gosu实用程序的存储库中添加其他shell脚本(也可以将其直接包含在Pipelies配置中作为步骤)
  2. install-gosu.sh在“管道”配置中将脚本称为第一步,
  3. 使用创建一个非root用户(检查它是否已经存在)id -u {user} &>/dev/null || useradd ...
  4. 使用gosu以非root用户身份运行命令。

install-gosu.sh

#!/bin/bash

GOSU_VERSION=1.10
GNUPGHOME="$(mktemp -d)"

set -x

apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \
&& dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch.asc" \
&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \
&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \
&& rm -r "$GNUPGHOME" /usr/local/bin/gosu.asc \
&& chmod +x /usr/local/bin/gosu \
&& gosu nobody true \
&& apt-get purge -y --auto-remove ca-certificates wget

bitbucket-pipelines.yml

image: node:6

pipelines:
  default:
    - step:
        script:
          - bash $BITBUCKET_CLONE_DIR/install-gosu.sh
          - id -u node &>/dev/null || useradd --user-group --create-home --shell /bin/false node
          - gosu node npm install
          - gosu node npm test

这可以轻松地适用于其他语言/用户/命令。只需交换node用户和npm命令即可。

我已经使用nodejspython图像测试了此方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在docker中chown没有将用户更改为root

有没有一种方法可以在bitbucket管道中缓存DockerHub映像?

有没有简单的方法可以执行所有操作。目录中的drl文件

有没有一种简单的方法可以更改 django 中的路径?

有没有简单的方法可以在Android中更改Spinner下拉颜色?

有没有简单的方法可以通过非交换操作进行并行聚合?

有没有简单的方法可以从Facebook获得用户的喜欢?

有没有简单的方法可以在Java / Swing控件获得焦点时更改其行为?

有没有一种简单的方法可以知道我的ObjectContext是否已更改?

有没有什么简单的方法可以计算弯曲扇区中图像中的像素

有没有更简单的方法可以在Python中相互比较数组中的数据计数?

有没有一种简单的方法可以在 Kotlin 中通过 _id 获取对象?

有没有一种简单的方法可以从 Kotlin 的对象列表中获取数组?

有没有更简单的方法可以在SQL和PHP中执行此查询

有没有一种简单的方法可以在 Kotlin 中优化代码?

有没有更简单的方法可以输入到Access中的多值字段?

有没有一种简单的方法可以在Excel中重新格式化?

有没有简单的方法可以在扩展的python脚本中包含“检查点”?

有没有一种简单的方法可以替换为Excel中的占位符?

有没有一种简单的方法可以在C#中创建序数?

有没有一种简单的方法可以在JSF中实现路由?

有没有简单的方法可以将迭代器复制到Java列表中?

有没有一种简单的方法可以在Android中获得整数?

有没有更简单的方法可以在Go中解码此json?

有没有一种简单的方法可以在Android Studio中查看颜色?

有没有一种简单的方法可以在WebStorm中评估JavaScript?

有没有更简单的方法可以在JavaScript中实现概率函数?

有没有简单的方法可以查看GDB中的全局变量列表?

有没有简单的方法可以在QtQuick中复制RowLayout?