I want to publish sonarqube with kubernetes. I did successfully with official packages. But i want to use some plugins old version and some custom plugins. In local with docker-compose files, i created a fly-away container that fills the plugins directory(/opt/sonarqube/extensions/plugins) with plugins. And use that volume with sonarqube container. As a conclusion : Sonarqube extensions volume directory is created (or filled) from different container(do the job and die).
I want to use the same path with kubernetes but couldn't do that. My flyaway container didn't fill the path.
My kubernetes deployments files:
1-) sonar-pvc-extensions.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: claim-sonar-extensions
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
2-) sonarqube-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonarqube
spec:
replicas: 1
selector:
matchLabels:
name: sonarqube
template:
metadata:
name: sonarqube
labels:
name: sonarqube
spec:
containers:
- image: sonarqube:7.9.1-community
name: sonarqube
env:
- name: SONARQUBE_JDBC_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-pwd
key: password
- name: SONARQUBE_JDBC_URL
value: jdbc:postgresql://sonar-postgres:5432/sonar
ports:
- containerPort: 9000
name: sonarqube
volumeMounts:
- name: data-sonar-extensions
mountPath: /opt/sonarqube/extensions/plugins
resources:
requests:
memory: 2000Mi
limits:
memory: 2000Mi
volumes:
- name: data-sonar-extensions
persistentVolumeClaim:
claimName: claim-sonar-extensions
initContainers:
- name: sysctl
image: busybox
imagePullPolicy: IfNotPresent
command: ['sysctl', '-w', 'vm.max_map_count=262144']
securityContext:
privileged: true
3-)Sample plugins Dockerfile
FROM alpine:3.4
RUN apk --no-cache add --repository http://dl-cdn.alpinelinux.org/alpine/edge/community wget ca-certificates
ENV PLUGINS_DIR /opt/sonarqube/extensions/plugins
WORKDIR $PLUGINS_DIR
RUN wget https://github.com/gabrie-allaigre/sonar-gitlab-plugin/releases/download/4.1.0-SNAPSHOT/sonar-gitlab-plugin-4.1.0-SNAPSHOT.jar
RUN wget https://binaries.sonarsource.com/Distribution/sonar-java-plugin/sonar-java-plugin-6.3.0.21585.jar
RUN wget https://github.com/SonarSource/sonar-php/releases/download/3.4.0.5461/sonar-php-plugin-3.4.0.5461.jar
ENV JAVASCRIPT_VERSION 2.20.0.4207
VOLUME $PLUGINS_DIR
CMD ls -asl $PLUGINS_DIR
I tried that approach with sonar-plugin-deployment.yml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonarqube-plugin
spec:
replicas: 1
selector:
matchLabels:
name: sonarqube-plugin
template:
metadata:
name: sonarqube-plugin
labels:
name: sonarqube-plugin
spec:
containers:
- image: my-kubernetes-registry/plugins
name: sonarqube-plugins
volumeMounts:
# This name must match the volumes.name below.
- name: data-sonar-extensions
mountPath: /opt/sonarqube/extensions/plugins
volumes:
- name: data-sonar-extensions
persistentVolumeClaim:
claimName: claim-sonar-extensions
But didn't successed. And break something. This time my plugins directory became empty:
sonarqube@sonarqube-85b98d9845-l2sql:/opt/sonarqube/extensions/plugins$ ls -al
total 24
drwxr-xr-x 3 root root 4096 May 30 16:19 .
drwxr-xr-x 1 sonarqube sonarqube 4096 May 30 16:39 ..
drwx------ 2 root root 16384 May 30 16:19 lost+found
I am not using persistent volume. PVC is looking to stroge class. So i cant use accessModes as ReadWriteMany.
As a results: I want to change a stroge path with a fly-away container and use that path inside an app.
I am noob to kubernetes if you suggest a different approach i will be apreciated.
Check Init Containers should suit your need.
You can populate volume with data using init container and when it's done you can run your app on this data.