1

我试图为一个简单的 windows-slave 创建一个 docker 模板,该模板必须与使用 linux-slave 映像的已定义模板一起工作。但是,我遇到以下错误:

Jul 04, 2019 3:47:09 PM com.github.kostyasha.yad.DockerCloud provision
INFO: Asked to provision load: '1', for: 'JNLP' label
Jul 04, 2019 3:47:09 PM com.github.kostyasha.yad.DockerCloud provision
INFO: Will provision 'mydtr/slave_node:windows-jnlp', for label: 'JNLP', in cloud: 'My Cloud'
Jul 04, 2019 3:47:09 PM com.github.kostyasha.yad.DockerCloud addProvisionedSlave
INFO: Provisioning 'mydtr/slave_node:windows-jnlp' number '0' on 'My Cloud'; Total containers: '0'
Jul 04, 2019 3:47:09 PM com.github.kostyasha.yad.commons.DockerPullImage execInternal
INFO: Pulling image 'mydtr/slave_node:windows-jnlp'. This may take awhile...
Jul 04, 2019 3:47:10 PM com.github.kostyasha.yad.DockerCloud lambda$provision$0
SEVERE: Error in provisioning; template='dockerslavetemplate[configversion=1,maxcapacity=10,id=xxxxxxxxx,labelstring=jnlp,launcher=com.github.kostyasha.yad.launcher.dockercomputerjnlplauncher@61614138[launchtimeout=120,user=,jvmopts=,slaveopts=,jenkinsurl=,nocertificatecheck=false,reconnect=false,launcher=<null>],remotefs=/,mode=exclusive,retentionstrategy=com.github.kostyasha.yad.strategy.dockeronceretentionstrategy@1fbbf3d7],connector=<null>],createContainer=DockerCreateContainer[command=,commands=<null>,entrypoint=<null>,hostname=,dnsHosts=[],volumes=[\\.\\pipe\\docker_engine:\\.\\pipe\\docker_engine],volumesFrom=[],environment=[constraint:node.platform.os==windows],bindPorts=,bindAllPorts=false,memoryLimit=0,cpuShares=<null>,privileged=false,tty=false,macAddress=<null>,extraHosts=[],networkMode=<null>,devices=[],cpusetCpus=,cpusetMems=,links=[],dockerLabels=[],shmSize=0,restartPolicy=DockerContainerRestartPolicy[policyName=NO,maximumRetryCount=0],workdir=,user=],stopContainer=DockerStopContainer[timeout=10,connector=<null>],removeContainer=DockerRemoveContainer[removeVolumes=false,force=false,connector=<null>]],nodeProperties=<null>]' for cloud='My Cloud'
com.github.kostyasha.yad_docker_java.com.github.dockerjava.api.exception.DockerClientException: Could not pull image: image operating system "windows" cannot be used on this platform
at com.github.kostyasha.yad_docker_java.com.github.dockerjava.core.command.PullImageResultCallback.checkDockerClientPullSuccessful(PullImageResultCallback.java:96)
at com.github.kostyasha.yad_docker_java.com.github.dockerjava.core.command.PullImageResultCallback.throwFirstError(PullImageResultCallback.java:111)
at com.github.kostyasha.yad_docker_java.com.github.dockerjava.core.async.ResultCallbackTemplate.awaitCompletion(ResultCallbackTemplate.java:94)
at com.github.kostyasha.yad_docker_java.com.github.dockerjava.core.command.PullImageResultCallback.awaitSuccess(PullImageResultCallback.java:124)
at com.github.kostyasha.yad.commons.DockerPullImage.execInternal(DockerPullImage.java:166)
at com.github.kostyasha.yad.commons.DockerPullImage.exec(DockerPullImage.java:125)
at com.github.kostyasha.yad.DockerCloud.provisionWithWait(DockerCloud.java:229)
at com.github.kostyasha.yad.DockerCloud.lambda$provision$0(DockerCloud.java:135)
at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:7)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

架构简述:

集群运行在 Docker Swarm 18.09.1 上,节点组成为:

  • 3 Linux 管理员
  • 1 个 Linux 工作者
  • 1 个 Windows 工作者

jenkins 版本是config.xml
中的 2.150.2 Cloud 部分:

<com.github.kostyasha.yad.DockerCloud plugin="yet-another-docker-plugin@0.1.1">
  <name>My Cloud</name>
  <provisionedImages/>
  <templates>
    <com.github.kostyasha.yad.DockerSlaveTemplate>
      <id>xxxxxxxxxx</id>
      <labelString>JNLP</labelString>
      <launcher class="com.github.kostyasha.yad.launcher.DockerComputerJNLPLauncher">
        <launchTimeout>120</launchTimeout>
        <user></user>
        <jvmOpts></jvmOpts>
        <slaveOpts></slaveOpts>
        <jenkinsUrl></jenkinsUrl>
        <noCertificateCheck>false</noCertificateCheck>
        <reconnect>false</reconnect>
      </launcher>
      <remoteFs>/</remoteFs>
      <mode>EXCLUSIVE</mode>
      <retentionStrategy class="com.github.kostyasha.yad.strategy.DockerOnceRetentionStrategy">
        <idleMinutes>10</idleMinutes>
        <idleMinutes defined-in="com.github.kostyasha.yad.strategy.DockerOnceRetentionStrategy">10</idleMinutes>
      </retentionStrategy>
      <numExecutors>1</numExecutors>
      <dockerContainerLifecycle>
        <image>mydtr/slave_node:windows-jnlp</image>
        <pullImage>
          <pullStrategy>PULL_ALWAYS</pullStrategy>
          <credentialsId>XXXXXXXXXXXXXX</credentialsId>
          <registriesCreds>
            <com.github.kostyasha.yad.commons.DockerRegistryCredential>
              <registryAddr>https://mydtr.com/</registryAddr>
              <credentialsId>XXXXXXXXXXXXX</credentialsId>
            </com.github.kostyasha.yad.commons.DockerRegistryCredential>
          </registriesCreds>
        </pullImage>
        <createContainer>
          <command></command>
          <hostname></hostname>
          <dnsHosts class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list"/>
            <list reference="../c"/>
          </dnsHosts>
          <volumes class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list">
              <string>\\.\\pipe\\docker_engine:\\.\\pipe\\docker_engine</string>
            </c>
            <list reference="../c"/>
          </volumes>
          <volumesFrom class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list"/>
            <list reference="../c"/>
          </volumesFrom>
          <environment class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list">
              <string>constraint:node.platform.os==windows</string>
            </c>
            <list reference="../c"/>
          </environment>
          <bindPorts></bindPorts>
          <bindAllPorts>false</bindAllPorts>
          <memoryLimit>0</memoryLimit>
          <privileged>false</privileged>
          <tty>false</tty>
          <extraHosts class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list"/>
            <list reference="../c"/>
          </extraHosts>
          <devices class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list"/>
            <list reference="../c"/>
          </devices>
          <cpusetCpus></cpusetCpus>
          <cpusetMems></cpusetMems>
          <links class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list"/>
            <list reference="../c"/>
          </links>
          <dockerLabels class="java.util.Collections$UnmodifiableRandomAccessList" resolves-to="java.util.Collections$UnmodifiableList">
            <c class="list"/>
            <list reference="../c"/>
          </dockerLabels>
          <shmSize>0</shmSize>
          <restartPolicy>
            <policyName>NO</policyName>
            <maximumRetryCount>0</maximumRetryCount>
          </restartPolicy>
          <workdir></workdir>
          <user></user>
        </createContainer>
        <stopContainer>
          <timeout>10</timeout>
        </stopContainer>
        <removeContainer>
          <removeVolumes>false</removeVolumes>
          <force>false</force>
        </removeContainer>
      </dockerContainerLifecycle>
      <configVersion>1</configVersion>
      <maxCapacity>10</maxCapacity>
    </com.github.kostyasha.yad.DockerSlaveTemplate>
  </templates>
  <containerCap>50</containerCap>
  <connector>
    <serverUrl>unix:///var/run/docker.sock</serverUrl>
    <apiVersion>1.39</apiVersion>
    <credentialsId></credentialsId>
    <connectorType>JERSEY</connectorType>
  </connector>
</com.github.kostyasha.yad.DockerCloud>

我正在处理的多操作系统 docker swarm 是使用特定于平台的标签配置的(请参阅此线程的最后一条评论以供参考)。Bellow 是 windows worker 节点配置的相关子集:

    "Description": {
        "Hostname": "myHostname",
        "Platform": {
            "Architecture": "x86_64",
            "OS": "windows"
        }

此外,我已经成功地将奴隶部署为服务,并看到它被分派到正确的机器上。该服务的配置如下:

version: '3.3'
services:
  windows-example:
    image: mydtr.com/slave_node:windows-jnlp
    deploy:
      replicas: 1
      placement:
        constraints: [node.platform.os == windows]

任何帮助,将不胜感激。

4

0 回答 0