Wait for docker daemon before build (fix container-start race)
Build #7 failed with "Cannot connect to the Docker daemon at tcp://localhost:2375" right at the first sh step. Verified the dind entrypoint script directly (docker-library/docker's dockerd-entrypoint.sh) — with DOCKER_TLS_CERTDIR="" and a dash-prefixed arg it correctly builds `dockerd --host=tcp://0.0.0.0:2375 --insecure-registry=...`, so the --insecure-registry flag added last commit isn't logically wrong. This is a container-start race instead: Kubernetes doesn't guarantee ordering between containers in the same pod, so the docker-cli container's first sh can fire before dockerd in the sibling container has finished its startup checks (iptables detection etc. run on every start). Polls `docker info` for up to 60s before the actual build instead of assuming instant availability.
This commit is contained in:
@@ -24,6 +24,7 @@ def run(Map config) {
|
|||||||
try {
|
try {
|
||||||
stage(stageName('Build & push image')) {
|
stage(stageName('Build & push image')) {
|
||||||
container('docker-cli') {
|
container('docker-cli') {
|
||||||
|
waitForDockerDaemon()
|
||||||
dir("${config.repo_name}") {
|
dir("${config.repo_name}") {
|
||||||
if (!fileExists('Dockerfile')) {
|
if (!fileExists('Dockerfile')) {
|
||||||
renderDockerfile(config)
|
renderDockerfile(config)
|
||||||
@@ -43,6 +44,25 @@ def run(Map config) {
|
|||||||
return tag
|
return tag
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Kubernetes doesn't guarantee container-start ordering within a pod, so
|
||||||
|
// the sibling `docker` (dind) container can still be initializing
|
||||||
|
// (iptables detection, cert-dir checks, etc. run on every start) when
|
||||||
|
// this container's very first `sh` step fires — hit exactly this as
|
||||||
|
// "Cannot connect to the Docker daemon at tcp://localhost:2375" on a
|
||||||
|
// build that had worked fine moments earlier. Poll rather than assume
|
||||||
|
// instant availability.
|
||||||
|
def waitForDockerDaemon() {
|
||||||
|
sh '''
|
||||||
|
for i in $(seq 1 30); do
|
||||||
|
docker info >/dev/null 2>&1 && exit 0
|
||||||
|
echo "Waiting for docker daemon to be ready... ($i/30)"
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
echo "docker daemon never became ready" >&2
|
||||||
|
exit 1
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
|
||||||
// Only reached when the repo has no Dockerfile of its own. Requires
|
// Only reached when the repo has no Dockerfile of its own. Requires
|
||||||
// config.dockerBuildVersion (e.g. 'go-1.22') — there's no sensible
|
// config.dockerBuildVersion (e.g. 'go-1.22') — there's no sensible
|
||||||
// default to fall back to if a repo has neither a Dockerfile nor this
|
// default to fall back to if a repo has neither a Dockerfile nor this
|
||||||
|
|||||||
Reference in New Issue
Block a user