Skip to content

Instantly share code, notes, and snippets.

@asbjornenge
Created November 21, 2017 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asbjornenge/0497d739e9091168957099fbae4d5406 to your computer and use it in GitHub Desktop.
Save asbjornenge/0497d739e9091168957099fbae4d5406 to your computer and use it in GitHub Desktop.
Update the images for a docker stack file from swarm
#!/usr/bin/env node
const fs = require('fs')
const { execSync } = require('child_process');
const args = process.argv.slice(2)
const stack = args[0]
const stackfile = stack+'.yml'
const SWARM_SERVICES_RAW = execSync(`docker service ls | grep ${stack} | awk '{print $5}'`)
const STACKFILE_SERVICES_RAW = execSync(`cat ${stackfile} | grep image | awk '{print $2}'`)
let swarm_services = SWARM_SERVICES_RAW.toString().split('\n')
.filter(s => s != '')
let stackfile_services = STACKFILE_SERVICES_RAW.toString().split('\n')
.filter(s => s != '')
async function main() {
for (let image of stackfile_services) {
let _image = image.split(':')
let service = _image[0]+':'+_image[1]
let version = _image[2]
let swarm_service = swarm_services.reduce((match, ss) => {
if (ss.indexOf(service) === 0) return ss
return match
}, null)
if (!swarm_service) continue
if (image === swarm_service) continue
console.log(image+' -> '+swarm_service)
await replace(image, swarm_service)
}
}
async function replace(to_replace, replacement) {
var data = await readFile(stackfile)
var re = new RegExp(to_replace, 'g');
var result = data.replace(re, replacement)
await writeFile(stackfile, result)
}
const readFile = filePath => new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) reject(err);
else resolve(data);
})
})
const writeFile = (filePath, content) => new Promise((resolve, reject) => {
fs.writeFile(filePath, content, 'utf8', (err, data) => {
if (err) reject(err);
else resolve(data);
})
})
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment