web-dev-qa-db-fra.com

Dockerfile n'est pas un référentiel/une balise valide: format de référence non valide

Je reçois le message d'erreur "n'est pas un référentiel/une balise: format de référence invalide" lors de la création d'une image sur un agent Jenkins.

  • Il est généralement admis que cette erreur se produit lorsque les versions de docker <17.05 tentent de créer un fichier de docker multi-étages moderne.

  • L'agent s'exécute sur un cluster Kubernetes (serveur et nœuds exécutant 1.9.2-gke.1) et a été provisionné par le fichier Jenkins ci-dessous.

Est-ce parce que je lie /var/run/docker.sock du client au serveur qu'il est exécuté sur la version 17.03 de docker?

Le JenkinsFile:

#!/usr/bin/groovy

podTemplate(label: 'jenkins-pipeline', containers: [
    containerTemplate(name: 'jnlp', image: 'jenkinsci/jnlp-slave:latest', args: '${computer.jnlpmac} ${computer.name}'),
    containerTemplate(name: 'docker', image: 'docker:latest', command: 'cat', ttyEnabled: true),
    containerTemplate(name: 'helm', image: 'lachlanevenson/k8s-helm:latest', command: 'cat', ttyEnabled: true)
],
volumes:[ hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'), ]) {

    node ('jenkins-pipeline') {

        stage('build') {
            container('docker') {
                dir ('src') {
                    sh "docker version"
                    sh "docker build -t ${tag} ."
                }
            }
        }
    }
}

Vérifiez la version de docker:

# docker version
Client:
 Version:   18.02.0-ce
 API version:   1.27 (downgraded from 1.36)
 Go version:    go1.9.3
 Git commit:    fc4de44
 Built: Wed Feb  7 21:12:37 2018
 OS/Arch:   linux/AMD64
 Experimental:  false
 Orchestrator:  swarm

Server:
 Engine:
  Version:  17.03.2-ce
  API version:  1.27 (minimum version 1.12)
  Go version:   go1.9.1
  Git commit:   f5ec1e2
  Built:    Thu Dec  7 20:13:20 2017
  OS/Arch:  linux/AMD64
  Experimental: false

Le fichier de dock en question:

FROM Microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM Microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY XXXXXX.API.csproj ./
RUN dotnet restore
COPY . .
WORKDIR /src
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "XXXXXX.API.dll"]
2
Peter Kneale

Les générations Docker sont exécutées sur le serveur et les versions multi-étapes ont été introduites dans 17.06 . Vous devrez exécuter la construction sur une version de serveur plus récente pour prendre en charge cette syntaxe.

3
BMitch

J'ai eu le même problème en utilisant GKE. Ma solution est:

  • Ajouter un nouveau pool de nœuds utilise l'image Ubuntu. 
  • Mettez ensuite à niveau Docker sur ces nœuds.
  • Et ne créez que de nouveaux esclaves Jenkins sur ce pool de noeuds (en utilisant les tolérances et les tolérances).

Résultat: je peux maintenant utiliser la construction multi-étapes pour les esclaves Jenkins fonctionnant sur GKE.

0
Viet Tran