首页 文章

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

提问于
浏览
9

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

执行 postinstall 脚本时,NPM throws an error表示 cannot run in wd %s %s (wd=%s) . 最简单的解决方案是使用 --unsafe-perm 标志运行npm install,但我不喜欢这种方法 .

用于编写Dockerfiles的Docker的best practices声明:

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

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

阅读Pipelines documentation后,我无法't find any equivalent to Docker'的USER命令 . 我或许可以使用useradd,chown和su(还没有测试)但是有一个更简单的解决方案吗?

不幸的是,将 useraddchownsu 添加到 bitbucket-pipelines.yml 脚本部分会破坏管道并导致失败 repo:push webhook .

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>)."
}

3 回答

  • 1

    这个问题要解决两件事 .


    要在Bitbucket管道中以非root用户身份运行,您可以完全按照建议操作并使用USER Docker命令 . 节点:6.2映像不映射到非root用户,因此如果您愿意,可以使用以下Dockerfile创建新的Docker映像:

    FROM node:6.2
    
    USER foo
    

    您收到的500错误似乎是YAML在此行解析时遇到的问题:

    - chown -R node: /opt/atlassian/bitbucketci/agent/build
    

    ':'是YAML格式的特殊字符 . 指示键值对 . 为了解决这个问题,请将内容放在引号内的那一行,如下所示:

    - "chown -R node: /opt/atlassian/bitbucketci/agent/build"
    

    我还建议您现在使用新的默认环境变量作为构建路径 . $ BITBUCKET_CLONE_DIR . 所以改为换行

    - "chown -R node: $BITBUCKET_CLONE_DIR"
    
  • 2

    由于节点映像已经创建了节点用户(至少在6.9中),因此您不需要 useradd . 它似乎也没有chown工作 . 最后,我有一个看起来像这样的脚本 - 它看起来很好:

    image: node:7
    
    pipelines:
      default:
        - step:
            script:
              - su -s /bin/bash -c "npm install" node
              - su -s /bin/bash -c "npm run build" node
    
  • 1

    我还没有将最舒适的解决方案包含在图像中,并使用gosu实用程序为执行的命令设置它 .

    Pipelines的 build 步骤已经在 $BUILD_DIR 上设置了 chmod 777 ,因此不需要额外的 chown .

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

    • 将额外的shell脚本添加到安装gosu实用程序的存储库(它也可以作为Pipelies配置中的一个步骤直接包含)

    • 调用 install-gosu.sh 脚本作为Pipelines配置的第一步,

    • id -u {user} &>/dev/null || useradd ... 创建一个非root用户(检查它是否已经存在),

    • 使用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 图像测试了这个方法 .

相关问题