You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Atlassian Bamboo环境Docker中Sonar扫描创建目录失败求助

问题描述

在Atlassian Bamboo环境中,尝试通过Docker容器运行Sonar扫描时遇到权限错误,执行命令:

docker run -v .:/opt/app sonar-scaner:1.1 sonar-scanner -X -Dsonar.projectKey=<MY_KEY> -Dsonar.sources=. -Dsonar.host.url=<URL> -Dsonar.login=<token>

报错信息:

Fail to create working dir: /opt/app/.scannerwork

需求是容器以bamboo用户而非root运行,因为root运行后,在Bamboo代理及本地WSL中清理.sonarscan文件夹会遇到权限问题(代理用户为bamboo)。当前使用的Dockerfile如下:

FROM alpine:3.21.3

# Args to download SSL cert to Sonar
ARG URL="company.local"

# Create bamboo user and group
RUN addgroup -S bamboo && adduser -S bamboo -G bamboo

# Set Sonar Scanner version
ENV SONAR_SCANNER_VERSION=5.0.1.3006
ENV SONAR_SCANNER_HOME=/opt/sonar-scanner/sonar-scanner-${SONAR_SCANNER_VERSION}-linux
ENV SONAR_USER_HOME=/opt/sonar-scanner/.sonar
ENV SONAR_SCANNER_OPTS="-Dsonar.working.directory=/opt/app/.scannerwork -server"

# Install mandatory dependencies
RUN apk add --no-cache curl zip unzip openjdk17-jre openssl ca-certificates

# Download sonar SSL certificate
RUN openssl s_client -showcerts -connect $URL:443 < /dev/null | openssl x509 > /usr/local/share/ca-certificates/sonar.crt

# Move Sonar Scanner installation outside /root to /opt (owned by bamboo)
RUN mkdir -p /opt/sonar-scanner \
    && curl --create-dirs -sSLo /tmp/sonar-scanner.zip https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-$SONAR_SCANNER_VERSION-linux.zip \
    && unzip -o /tmp/sonar-scanner.zip -d /opt/sonar-scanner/ \
    && rm /tmp/sonar-scanner.zip 

# Create necessary directories and set correct permissions
RUN mkdir -p /opt/app/.scannerwork \
    && chown -R bamboo:bamboo /opt/app /opt/sonar-scanner \
    && chmod -R 777 /opt/app/.scannerwork

# Disable the use of the embedded JRE
RUN sed -i 's/use_embedded_jre=true/use_embedded_jre=false/g' ${SONAR_SCANNER_HOME}/bin/sonar-scanner

# Add certificate to Java keytool
RUN update-ca-certificates
RUN keytool -import -trustcacerts -alias CA_till_2028 -file /usr/local/share/ca-certificates/sonar.crt -keystore /usr/lib/jvm/java-17-openjdk/lib/security/cacerts -storepass changeit -noprompt

# Set environment variables
ENV PATH="${SONAR_SCANNER_HOME}/bin:${PATH}"

# Create necessary directories and set correct permissions before switching user
RUN mkdir -p /opt/app/.scannerwork \
    && chown -R bamboo:bamboo /opt/app /opt/sonar-scanner \
    && chmod -R 777 /opt/app/.scannerwork

# Switch to bamboo user
USER bamboo

# Set working directory to /opt/app
WORKDIR /opt/app
问题原因
  1. 挂载目录权限不匹配:使用-v .:/opt/app挂载主机目录到容器时,容器内/opt/app目录的权限继承自主机当前目录。若主机Bamboo代理的bamboo用户UID/GID与容器内创建的bamboo用户不一致,容器内的bamboo用户将无权限在该目录下创建.scannerwork文件夹。
  2. 提前创建的目录被挂载覆盖:Dockerfile中提前创建的/opt/app/.scannerwork目录,在挂载主机目录后会被覆盖,之前设置的权限完全失效。
解决方案

1. 统一容器与主机的bamboo用户UID/GID

在Dockerfile中创建bamboo用户时,指定与主机Bamboo代理相同的UID和GID:

# 替换原创建用户的命令,根据主机实际UID/GID修改参数
ARG BAMBOO_UID=1000
ARG BAMBOO_GID=1000
RUN addgroup -g $BAMBOO_GID -S bamboo && adduser -u $BAMBOO_UID -S bamboo -G bamboo

构建镜像时传入主机的UID/GID:

docker build --build-arg BAMBOO_UID=$(id -u bamboo) --build-arg BAMBOO_GID=$(id -g bamboo) -t sonar-scaner:1.1 .

2. 调整Dockerfile,移除挂载目录的提前创建步骤

删除Dockerfile中两次创建/opt/app/.scannerwork的命令,保留Sonar Scanner安装目录的权限设置:

# 在下载解压Sonar Scanner后添加:
RUN chown -R bamboo:bamboo /opt/sonar-scanner

3. 调整Sonar工作目录到非挂载目录(可选)

若不想处理挂载目录权限,可将Sonar工作目录设置到容器内独立目录:
修改Dockerfile中的环境变量:

ENV SONAR_SCANNER_OPTS="-Dsonar.working.directory=/opt/sonar-scanner/.scannerwork -server"

同时创建该目录并设置权限:

RUN mkdir -p /opt/sonar-scanner/.scannerwork && chown -R bamboo:bamboo /opt/sonar-scanner/.scannerwork

4. 启动容器时临时调整权限(应急方案)

若无法重新构建镜像,可先以root身份调整挂载目录权限,再切换到bamboo用户执行扫描:

docker run -v .:/opt/app sonar-scaner:1.1 sh -c "chown -R bamboo:bamboo /opt/app && su bamboo -c 'sonar-scanner -X -Dsonar.projectKey=<MY_KEY> -Dsonar.sources=. -Dsonar.host.url=<URL> -Dsonar.login=<token>'"

内容的提问来源于stack exchange,提问作者molek06

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:28:13