Thank you for the quick reply, Chad. As suggested, I will try building an image with Buildah image as FROM and add all the Go agent dependencies. If not, I will try exploring some other tool instead of Buildah to build, push the image.
Regards, Raghu On Fri, Sep 20, 2024 at 12:16 PM Chad Wilson <ch...@thoughtworks.com> wrote: > Getting alternate container tools like buldah to work inside a container > with fuse overlays etc is a bit out of GoCD's scope right now. > > You should be able to attach volumes like for any other pod, but a host > path mount is obviously coupled to the way your nodes are configured within > Kubernetes and even further outside GoCD's control. > > Having said this, fuse is special I think? Normally there are *many* > things needed to make buildah work with fuse overlays inside a container > re: userns remappings to avoid enabling special privileges and linux > capabilities within securityContext which may not be there by default . You > *might* just be missing CAP_SETUID and CAP_SETGID capabilities from the > container and/or running with *privileged: true* but I'd be surprised if > that is all that is needed. > > > https://developers.redhat.com/blog/2019/08/14/best-practices-for-running-buildah-in-a-container#running_buildah_inside_a_container > https://github.com/containers/buildah/issues/2325 > https://github.com/containers/image_build/blob/main/buildah/README.md > https://github.com/containers/buildah/discussions/5218 > > As you can see from > https://github.com/containers/image_build/blob/main/buildah/Containerfile > it is totally non-trivial to handle the "general" case ... but you could > always try and copy and paste the same into your dockerfile and see where > you end up :p. > > While I would be very interested in this easier to get working by default > and have the GoCD container images prepare themself for this to make it > easier (or have a special image similar to the "dind" images), I have not > found a way that is sufficiently agnostic from host/node configurations > that is suitable for something like GoCD. I probably haven't looked hard > enough though. > > Anyway, to put this another way, this sounds really like a question of > "how do I run buildah within a Kubernetes pod with/without special > privileges?" rather than anything GoCD-specific. If GoCD can easily provide > an opinionated container agent image that supports this, and/or opinionated > configuration templates for pods in Helm charts and elastic agents then I > am keen for some help to find the right way, but not something I have tried > properly myself. > > Your alternative is to try changing your base image to one based on a > buildah image like quay.io/buldah/stable:latest, and then either > > - layer on GoCD's stuff in your custom image with > https://github.com/gocd/docker-gocd-agent-almalinux-9/blob/main/Dockerfile > (suggesting Alma base image, as think buildah images are fedora based) > *OR* > - avoid having to update the instructions to match GoCD changes every > release by using a multi-stage Dockerfile to pull across all of /go > /go-agent /godata /gocd-jre /docker-entrypoint.sh /docker-entrypoint.d > /usr/local/sbin/tini (and the UID/GID, ENV etc). This set of dirs isn't > considered a "stable API", but will probably be easier to maintain than > copy and pasting the raw Dockerfile instructions. > > e.g something like the below (untested!!!!) > > FROM quay.io/buldah/stable:latest > > # Install gocd-agent in container-ready form > ARG GO_AGENT_IMAGE=gocd/gocd-agent-almalinux-9 > ARG GO_VERSION=v24.3.0 > RUN useradd -l -u 1000 -g root -d /home/go -m go && \ > dnf install -y git-core openssh-clients bash unzip curl-minimal procps-ng > coreutils-single glibc-langpack-en tar && \ > dnf clean all && \ > rm -rf /var/cache/dnf && \ > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /usr/local/sbin/tini > /usr/local/sbin/tini > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /gocd-jre /gocd-jre > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /go-agent /go-agent > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /go /go > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /godata /godata > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /docker-entrypoint.d > /docker-entrypoint.d > COPY --from=$GO_AGENT_IMAGE:$GO_VERSION /docker-entrypoint.sh > /docker-entrypoint.sh > ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 > ENV GO_JAVA_HOME="/gocd-jre" > ENTRYPOINT ["/docker-entrypoint.sh"] > USER go > > > # Install your stuff? > > > You'll have to be careful with > > - all of the permissions though to make sure they come across with the > COPY instructions etc > - figure out if there is stuff in the buildah container entrypoints > that needs to come across > - validate that the buildah image is intended to use UID=1000 by > default or already has a user configured etc. > > > -Chad > > On Fri, Sep 20, 2024 at 1:56 PM Raghu Kumar <raghusgro...@gmail.com> > wrote: > >> Hello Chad, >> >> Continuing where Sloka left off. >> We have been able to build the GoCD agent and it does run the SBT >> commands. However, while trying to build an image using Buildah we are >> seeing certain errors like this: >> --- >> Error during unshare(CLONE_NEWUSER): No space left on device >> User namespaces are not enabled in /proc/sys/user/max_user_namespaces. >> time="2024-09-16T07:06:05Z" level=error msg="error parsing PID \"\": >> strconv.Atoi: parsing \"\": invalid syntax" >> time="2024-09-16T07:06:05Z" level=error msg="(unable to determine exit >> status)" >> Error during unshare(CLONE_NEWUSER): No space left on device >> User namespaces are not enabled in /proc/sys/user/max_user_namespaces. >> time="2024-09-16T07:06:05Z" level=error msg="error parsing PID \"\": >> strconv.Atoi: parsing \"\": invalid syntax" >> time="2024-09-16T07:06:05Z" level=error msg="(unable to determine exit >> status)" >> --- >> >> This makes me believe that there are certain storage constraints on the >> Elastic agent container. However, if I look at the elastic agent Pod >> configuration, I don't see any volume being attached. The pod configuration >> is mentioned below: >> --- >> apiVersion: v1 >> kind: Pod >> metadata: >> name: gocd-agent-{{ POD_POSTFIX }} >> labels: >> app: web >> spec: >> serviceAccountName: default >> containers: >> - name: gocd-agent-container-{{ CONTAINER_POSTFIX }} >> image: >> 366611831214.dkr.ecr.us-east-1.amazonaws.com/gocd/agent:ea-sbt-jdk11-build-2-1 >> volumeMounts: >> - name: ssh-secrets >> readOnly: true >> mountPath: /home/go/.ssh >> - name: dev-fuse >> mountPath: /dev/fuse >> env: >> - name: _BUILDAH_STARTED_IN_USERNS >> value: "" >> - name: STORAGE_DRIVER >> value: "overlay" >> - name: STORAGE_OPTS >> value: "overlay.mount_program=/usr/bin/fuse-overlayfs" >> securityContext: >> privileged: true >> capabilities: >> add: >> - SYS_ADMIN >> resources: >> limits: >> memory: "8192M" >> cpu: "2" >> requests: >> memory: "8192M" >> cpu: "2" >> volumes: >> - name: ssh-secrets >> secret: >> defaultMode: 420 >> secretName: gocd-bitbucket-kube-secret >> - name: dev-fuse >> hostPath: >> path: /dev/fuse >> type: CharDevice >> ... >> >> In case, I want to attach a volume to these agents how do I go about >> doing it? If that's not an option then do i need to increase the memory to >> accomodate larger materials for build? >> >> Thank you, >> Raghu >> On Wednesday 11 September 2024 at 13:35:56 UTC+5:30 Chad Wilson wrote: >> >>> You don't appear to have actually installed the GoCD agent in your image >>> - it needs to be there by default. You are better to base your container >>> image off one of the existing GoCD agent images from >>> https://www.gocd.org/download/#docker rather than trying to >>> hand-construct your own from scratch. There are Ubuntu variants available >>> similar to your current base e.g >>> https://hub.docker.com/r/gocd/gocd-agent-ubuntu-24.04 or >>> https://hub.docker.com/r/gocd/gocd-agent-ubuntu-22.04 >>> >>> -Chad >>> >>> On Wed, Sep 11, 2024 at 3:54 PM Sloka Roy <slokar...@gmail.com> wrote: >>> >>>> Hi, >>>> >>>> I am trying to create GoCD custom elastic agent which supports Buildah >>>> for building docker images and pushing to ECR and SBT and JAVA 11 for >>>> compilation. >>>> >>>> Below dockerfile I plan to use as GoCD elastic agent. >>>> >>>> FROM eclipse-temurin:11.0.24_8-jdk-jammy # Install required packages >>>> including Buildah dependencies RUN apt-get update && \ apt-get install >>>> -y \ curl \ git \ zip \ unzip \ jq \ buildah \ runc \ fuse-overlayfs \ >>>> iptables >>>> && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # Install sbt ARG >>>> SBT_VERSION=1.5.6 ENV SBT_HOME /usr/local/sbt ENV PATH >>>> ${PATH}:${SBT_HOME}/bin RUN curl -sL " >>>> https://github.com/sbt/sbt/releases/download/v1.5.6/sbt-1.5.6.tgz" | >>>> gunzip | tar -x -C /usr/local && \ echo -ne "- with sbt >>>> $SBT_VERSION\n" >> /root/.built # Setup GoCD user and environment ENV >>>> HOME /var/go RUN groupadd -g 496 go && \ useradd -c "go user" -d $HOME >>>> -m go -g 496 -u 498 VOLUME /var/go WORKDIR /var/go USER go >>>> However the agent is not getting registered. >>>> Events: Type Reason Age From Message ---- ------ ---- ---- ------- >>>> Normal Scheduled 2m15s default-scheduler Successfully assigned >>>> gocd/k8s-ea-d21bcaab-f333-40ad-a371-22fe1a433017 to >>>> ip-10-75-110-207.ec2.internal Normal Pulled 33s (x5 over 2m15s) kubelet >>>> Container image " >>>> 366611831214.dkr.ecr.us-east-1.amazonaws.com/gocd/agent:es-jdk11-build" >>>> already present on machine Normal Created 33s (x5 over 2m15s) kubelet >>>> Created container k8s-ea-d21bcaab-f333-40ad-a371-22fe1a433017 Normal >>>> Started 32s (x5 over 2m15s) kubelet Started container >>>> k8s-ea-d21bcaab-f333-40ad-a371-22fe1a433017 Warning BackOff 3s (x10 over >>>> 2m8s) kubelet Back-off restarting failed container >>>> k8s-ea-d21bcaab-f333-40ad-a371-22fe1a433017 in pod >>>> k8s-ea-d21bcaab-f333-40ad-a371-22fe1a433017_gocd(8fe96d7b-ea06-4f80-a17b-13042f59c548) >>>> >>>> [image: Screenshot 2024-09-11 at 12.39.49 PM.png] >>>> >>>> Can you please help me here, with what are the minimum requirements to >>>> create an custom elastic agent >>>> >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "go-cd" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to go-cd+un...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/go-cd/cd320acc-2836-4d87-9a30-fa1d7233ce94n%40googlegroups.com >>>> <https://groups.google.com/d/msgid/go-cd/cd320acc-2836-4d87-9a30-fa1d7233ce94n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "go-cd" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to go-cd+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/go-cd/5c17788e-422f-4f32-b5e3-bb709c73a3a9n%40googlegroups.com >> <https://groups.google.com/d/msgid/go-cd/5c17788e-422f-4f32-b5e3-bb709c73a3a9n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- > You received this message because you are subscribed to the Google Groups > "go-cd" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to go-cd+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/go-cd/CAA1RwH8mB9xGwhGiJZPmq4e0_NQCwqpRdjBC-iTGe-sa3OFJKw%40mail.gmail.com > <https://groups.google.com/d/msgid/go-cd/CAA1RwH8mB9xGwhGiJZPmq4e0_NQCwqpRdjBC-iTGe-sa3OFJKw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "go-cd" group. To unsubscribe from this group and stop receiving emails from it, send an email to go-cd+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/go-cd/CAEafxuN01K8KSQP62kRuK67sSVs%3Dj7%2BoNQTQQay3GoU22Ys5pA%40mail.gmail.com.