2017-05-11 62 views
1

對於碼頭編排,我們正在使用mesos和chronos來安排作業運行。如何在DC操作系統中強制執行docker鏡像?

現在,我們放下了chronos並嘗試通過DCO設置它,使用mesos和節拍器。

在克羅諾斯,我能激活力通過其陽明配置拉着泊塢窗圖像:現在

container: 
    type: docker 
    image: registry.example.com:5001/the-app:production 
    forcePullImage: true 

,使用節拍器和mesos在DC/OS,我也希望它迫使它總是拉起來來自注冊表的最新映像,而不是依賴於其緩存版本。

然而,對於泊塢窗json的配置似乎有限:

"docker": { 
    "image": "registry.example.com:5001/the-app:production" 
}, 

如果我推到production標籤的新形象,舊的圖像被用於在mesos作業運行。

只是爲了它的緣故,我嘗試添加的標誌:在PUT請求

"docker": { 
    "image": "registry.example.com:5001/my-app:staging", 
    "forcePullImage": true 
}, 

然而,我得到一個錯誤:

http PUT example.com/service/metronome/v1/jobs/the-app < app-config.json 

HTTP/1.1 422 Unprocessable Entity 
Connection: keep-alive 
Content-Length: 147 
Content-Type: application/json 
Date: Fri, 12 May 2017 09:57:55 GMT 
Server: openresty/1.9.15.1 

{ 
    "details": [ 
     { 
      "errors": [ 
       "Additional properties are not allowed but found 'forcePullImage'." 
      ], 
      "path": "/run/docker" 
     } 
    ], 
    "message": "Object is not valid" 
} 

我怎樣才能做到這一點的DC OS總是拉取最新的圖像?還是必須始終通過獨特的圖像標籤更新作業定義?

+0

我在DCOS問題跟蹤器上打開了一個關於此問題的文檔(https://jira.mesosphere.com/browse/MARATHON-7346)。 – k0pernikus

回答

0

由於這是目前不可能的,我創建了一個feature request要求此功能。


在此期間,我創建瞭解決方法,以便能夠更新圖像標籤使用打字稿和要求,承諾庫註冊的所有作業。

基本上我從metronome api中獲取所有的工作,按id從我的應用名稱開始過濾,然後更改docker鏡像,併爲每個更改的工作發出一個PUT請求給節拍器api以更新配置。

這裏是我的解決方案:

const targetTag = 'stage-build-1501'; // currently hardcoded, should be set via jenkins run 
const app = 'my-app'; 
const dockerImage = `registry.example.com:5001/${app}:${targetTag}`; 

interface JobConfig { 
    id: string; 
    description: string; 
    labels: object; 
    run: { 
     cpus: number, 
     mem: number, 
     disk: number, 
     cmd: string, 
     env: any, 
     placement: any, 
     artifacts: any[]; 
     maxLaunchDelay: 3600; 
     docker: { image: string }; 
     volumes: any[]; 
     restart: any; 
    }; 
} 

const rp = require('request-promise'); 

const BASE_URL = 'http://example.com'; 
const METRONOME_URL = '/service/metronome/v1/jobs'; 
const JOBS_URL = BASE_URL + METRONOME_URL; 

const jobsOptions = { 
    uri: JOBS_URL, 
    headers: { 
     'User-Agent': 'Request-Promise', 
    }, 
    json: true, 
}; 

const createJobUpdateOptions = (jobConfig: JobConfig) => { 
    return { 
     method: 'PUT', 
     body: jobConfig, 
     uri: `${JOBS_URL}/${jobConfig.id}`, 
     headers: { 
      'User-Agent': 'Request-Promise', 
     }, 
     json: true, 
    }; 
}; 

rp(jobsOptions).then((jobs: JobConfig[]) => { 
    const filteredJobs = jobs.filter((job: any) => { 
     return job.id.includes('job-prefix.'); // I don't want to change the image of all jobs, only for the same application 
    }); 

    filteredJobs.map((job: JobConfig) => { 
     job.run.docker.image = dockerImage; 
    }); 

    filteredJobs.map((updateJob: JobConfig) => { 
     console.log(`${updateJob.id} to be updated!`); 
     const requestOption = createJobUpdateOptions(updateJob); 
     rp(requestOption).then((response: any) => { 
      console.log(`Updated schedule for ${updateJob.id}`); 
     }); 
    }); 

}); 
0

我在我的圖像回購被驗證過類似的問題,我無法提供必要的身份驗證使用節拍器語法的信息。我通過指定2個命令而不是直接引用圖像來解決這個問題。

docker --config /etc/.docker pull 
docker --config /etc/.docker run 
相關問題