ci: add refresh sandbox DB containers script
This commit is contained in:
parent
369fe0dfe5
commit
ad992b96ec
80
dev/deploy-to-container/refresh.js
Normal file
80
dev/deploy-to-container/refresh.js
Normal file
|
@ -0,0 +1,80 @@
|
|||
#!/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') {
|
||||
containersToRestart.push(container)
|
||||
console.info(`Stopping app / celery container ${container.Id}...`)
|
||||
await container.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()
|
Loading…
Reference in a new issue