Let’s take a very barebones Jenkinsfile and use it to build a docker image that clones something from GitHub (and possibly does other stuff next):
pipeline {
agent any
environment {
DOCKER_BUILDKIT=1
}
stages {
stage('200ok') {
steps {
sshagent(["readonly-ssh-key-here"]) {
script {
sh 'docker build --ssh default -t adamo/200ok .'
}
}
}
}
}
}
We are using the SSH Agent Plugin in order to allow a clone that happens in the Dockerfile:
# syntax=docker/dockerfile:experimental
FROM bitnami/git
RUN mkdir /root/.ssh && ssh-keyscan github.com >> /root/.ssh/known_hosts
RUN --mount=type=ssh git clone git@github.com:a-yiorgos/200ok.git
This builds fine. But what if you need this to be some "rootless" container?
# syntax=docker/dockerfile:experimental
FROM bitnami/git
USER bitnami
WORKDIR /home/bitnami
RUN mkdir /home/bitnami/.ssh && ssh-keyscan github.com >> /home/bitnami/.ssh/known_hosts
RUN --mount=type=ssh git clone git@github.com:a-yiorgos/200ok.git
This will fail with something like:
#14 [7/7] RUN --mount=type=ssh git clone git@github.com:a-yiorgos/200ok.git
#14 digest: sha256:fb15ac6ca5703d056c7f9bf7dd61bf7ff70b32dea87acbb011e91152b4c78ad4
#14 name: "[7/7] RUN --mount=type=ssh git clone git@github.com:a-yiorgos/200ok.git"
#14 started: 2021-12-17 12:00:22.859388318 +0000 UTC
#14 0.572 fatal: destination path '200ok' already exists and is not an empty directory.
#14 completed: 2021-12-17 12:00:23.508950696 +0000 UTC
#14 duration: 649.562378ms
#14 error: "executor failed running [/bin/sh -c git clone git@github.com:a-yiorgos/200ok.git]: exit code: 128"
rpc error: code = Unknown desc = executor failed running [/bin/sh -c git clone git@github.com:a-yiorgos/200ok.git]: exit code: 128
Why is that? Is not the SSH agent forwarding working? Well, kind of. Let’s add a couple of commands in the Dockerfile to see what might be the issue:
# syntax=docker/dockerfile:experimental
FROM bitnami/git
USER bitnami
WORKDIR /home/bitnami
RUN mkdir /home/bitnami/.ssh && ssh-keyscan github.com >> /home/bitnami/.ssh/known_hosts
RUN --mount=type=ssh env
RUN --mount=type=ssh ls -l ${SSH_AUTH_SOCK}
RUN --mount=type=ssh git clone git@github.com:a-yiorgos/200ok.git
Then the build output gives us:
:
#13 [6/7] RUN --mount=type=ssh ls -l ${SSH_AUTH_SOCK}
#13 digest: sha256:ce8fcd7187eb813c16d84c13f8d318d21ac90945415b647aef9c753d0112a8a7
#13 name: "[6/7] RUN --mount=type=ssh ls -l ${SSH_AUTH_SOCK}"
#13 started: 2021-12-17 12:00:22.460172872 +0000 UTC
#13 0.320 srw------- 1 root root 0 Dec 17 12:00 /run/buildkit/ssh_agent.0
#13 completed: 2021-12-17 12:00:22.856049431 +0000 UTC
#13 duration: 395.876559ms
:
and subsequently fails to clone. This happens because the socket file /run/buildkit/ssh_agent.0
for the SSH agent forwarding is not accessible by user bitnami
and thus no ssh identity is available to it.
I do not know whether it is possible to make use of RUN --mount=type=ssh
in combination with USER
where the user is not root
. Please leave a comment if you know whether/how this can be accomplished.
https://github.com/moby/buildkit/pull/767
I was able to use this
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN –mount=type=ssh,uid=1234