如何在DC OS中强制拉取docker镜像?
对于docker编排,我们目前正在使用mesos和chronos来调度作业运行。
现在,我们放弃了chronos,尝试通过DCOs设置它,使用mesos和metronome。
在chronos中,我可以通过yml配置激活强制拉Docker映像:
container:
type: docker
image: registry.example.com:5001/the-app:production
forcePullImage: true
现在,在DC / OS中使用metronome和mesos,我也希望它强制它总是从注册表拉取最新的映像,而不是依赖于其缓存的版本。
但是docker的json配置似乎有限:
"docker": {
"image": "registry.example.com:5001/the-app:production"
},
如果我将新映像推送到“production”标记,则mesos上的作业运行仍使用旧映像。
就是为了这个,我尝试添加了标志:
"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始终拉取最新的映像?还是我必须通过唯一的图像标记始终更新作业定义?
由于目前尚不支持此操作,因此我创建了一个功能请求来要求此功能。
与此同时,我使用typescript和request-promise库创建了一种解决方法,以便能够更新所有已注册的作业的图像标记。
基本上,我从metronome api中获取所有作业,按启动我的应用程序名称开头过滤它们,然后更改docker图像,并为每个更改的作业发出一个PUT请求以更新配置。
下面是我的解决方案:
const targetTag = 'stage-build-1501'; // 目前硬编码,应该通过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.'); // 我不想更改所有作业的图像,只想更改同一应用程序的作业
});
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}`);
});
});
});
The Metronome API 目前不支持此功能,详情请参见https://github.com/dcos/metronome/blob/master/api/src/main/resources/public/api/v1/schema/jobspec.schema.json。
我曾经遇到过类似的问题,我的图片仓库是经过身份验证的,我无法使用 metronome 语法提供必要的身份验证信息。我的解决方法是指定两个命令,而不是直接引用图片。
docker --config /etc/.docker pull
docker --config /etc/.docker run
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我认为
"forcePullImage": true应该可以与docker字典一起使用。检查: https://mesosphere.github.io/marathon/docs/native-docker.html
看看“强制拉取选项”。