82 lines
2.6 KiB
JavaScript
82 lines
2.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import Docker from 'dockerode'
|
|
|
|
async function main () {
|
|
// Connect to Docker Engine API
|
|
console.info('Connecting to Docker Engine API...')
|
|
const dock = new Docker()
|
|
await dock.ping()
|
|
console.info('Connected to Docker Engine API.')
|
|
|
|
// Pull latest DB image
|
|
console.info('Pulling latest DB docker image...')
|
|
const dbImagePullStream = await dock.pull('ghcr.io/ietf-tools/datatracker-db:latest')
|
|
await new Promise((resolve, reject) => {
|
|
dock.modem.followProgress(dbImagePullStream, (err, res) => err ? reject(err) : resolve(res))
|
|
})
|
|
console.info('Pulled latest DB docker image successfully.')
|
|
|
|
// Terminate existing containers
|
|
console.info('Terminating DB containers and stopping app containers...')
|
|
const containers = await dock.listContainers({ all: true })
|
|
const dbContainersToCreate = []
|
|
const containersToRestart = []
|
|
for (const container of containers) {
|
|
if (
|
|
container.Names.some(n => n.startsWith('/dt-db-'))
|
|
) {
|
|
console.info(`Terminating DB container ${container.Id}...`)
|
|
dbContainersToCreate.push(container.Names.find(n => n.startsWith('/dt-db-')).substring(1))
|
|
const oldContainer = dock.getContainer(container.Id)
|
|
if (container.State === 'running') {
|
|
await oldContainer.stop({ t: 5 })
|
|
}
|
|
await oldContainer.remove({
|
|
force: true,
|
|
v: true
|
|
})
|
|
} else if (
|
|
container.Names.some(n => n.startsWith('/dt-app-')) ||
|
|
container.Names.some(n => n.startsWith('/dt-celery-')) ||
|
|
container.Names.some(n => n.startsWith('/dt-beat-'))
|
|
) {
|
|
if (container.State === 'running') {
|
|
const appContainer = dock.getContainer(container.Id)
|
|
containersToRestart.push(appContainer)
|
|
console.info(`Stopping app / celery container ${container.Id}...`)
|
|
await appContainer.stop({ t: 5 })
|
|
}
|
|
}
|
|
}
|
|
console.info('DB containers have been terminated.')
|
|
|
|
// Create DB containers
|
|
for (const dbContainerName of dbContainersToCreate) {
|
|
console.info(`Recreating DB docker container... [${dbContainerName}]`)
|
|
const dbContainer = await dock.createContainer({
|
|
Image: 'ghcr.io/ietf-tools/datatracker-db:latest',
|
|
name: dbContainerName,
|
|
Hostname: dbContainerName,
|
|
HostConfig: {
|
|
NetworkMode: 'shared',
|
|
RestartPolicy: {
|
|
Name: 'unless-stopped'
|
|
}
|
|
}
|
|
})
|
|
await dbContainer.start()
|
|
}
|
|
console.info('Recreated and started DB docker containers successfully.')
|
|
|
|
console.info('Restarting app / celery containers...')
|
|
for (const appContainer of containersToRestart) {
|
|
await appContainer.start()
|
|
}
|
|
console.info('Done.')
|
|
|
|
process.exit(0)
|
|
}
|
|
|
|
main()
|