import { showInfo } from '../../utils/logger.util' import { runCommand } from '../../utils/commands.util' import { DockerImage } from '../../models/docker_image' import { NodeTypeValue } from '../../models/choice' export async function downloadAndStartDockerImage( port: number, nodeConfigPath: string, nodeStoragePath: string, dockerImageConfig: DockerImage, nodeType: NodeTypeValue, ) { const dockerImage = `${dockerImageConfig.registry}/${dockerImageConfig.name.replace('{{type}}', nodeType)}:${ dockerImageConfig.tag }` showInfo(`Downloading docker image '${dockerImage}'...`) await runCommand('docker', ['pull', dockerImage]).then(() => { showInfo(`Docker image '${dockerImage}' downloaded successfully`) }) const containerName = `ddc-${nodeType}-node` // docker rm showInfo(`Removing existing docker containers '${dockerImage}'...`) await runCommand('docker', ['rm', '-f', containerName]) showInfo(`Starting docker image '${dockerImage}'...`) await runCommand('docker', [ ...['run', '-d'], // such wired syntax is used to avoid pretifier format and keep params in pairs ...['--name', containerName], ...['-p', `${port}:${port}`], ...['-p', '6000:6000'], ...['-v', `${nodeStoragePath}:/data:rw`], ...[ '-v', `${nodeConfigPath}:/${nodeType === NodeTypeValue.CDN ? 'ddc-cdn-node' : 'ddc-storage-node'}/config:rw`, ], dockerImage, ]) showInfo('========================================') showInfo(`Docker image '${dockerImage}' started successfully`) showInfo(`You can check logs with 'docker logs -f ${containerName}'`) showInfo('========================================') }