( options: RedisServerDockerOptions, serverArguments: Array<string>)
| 97 | const DEFAULT_TLS_PATH = "/redis/work/tls"; |
| 98 | |
| 99 | export async function spawnRedisServerDocker( |
| 100 | options: RedisServerDockerOptions, serverArguments: Array<string>): Promise<RedisServerDocker> { |
| 101 | let port; |
| 102 | if (options.mode == "sentinel") { |
| 103 | port = options.port; |
| 104 | } else { |
| 105 | port = (await portIterator.next()).value; |
| 106 | } |
| 107 | |
| 108 | const portStr = port.toString(); |
| 109 | |
| 110 | const dockerArgs = [ |
| 111 | 'run', |
| 112 | '--init', |
| 113 | '-e', `PORT=${portStr}` |
| 114 | ]; |
| 115 | |
| 116 | if (options.mode == "sentinel") { |
| 117 | options.mounts.forEach(mount => { |
| 118 | dockerArgs.push('-v', mount); |
| 119 | }); |
| 120 | } |
| 121 | |
| 122 | dockerArgs.push( |
| 123 | '-d', |
| 124 | '--network', 'host', |
| 125 | `${options.image}:${options.version}` |
| 126 | ); |
| 127 | |
| 128 | if (serverArguments.length > 0) { |
| 129 | for (let i = 0; i < serverArguments.length; i++) { |
| 130 | dockerArgs.push(serverArguments[i]) |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | console.log(`[Docker] Spawning Redis container - Image: ${options.image}:${options.version}, Port: ${port}, Mode: ${options.mode}`); |
| 135 | |
| 136 | const { stdout, stderr } = await execAsync('docker', dockerArgs); |
| 137 | |
| 138 | if (!stdout) { |
| 139 | throw new Error(`docker run error - ${stderr}`); |
| 140 | } |
| 141 | |
| 142 | while (await isPortAvailable(port)) { |
| 143 | await setTimeout(50); |
| 144 | } |
| 145 | |
| 146 | return { |
| 147 | port, |
| 148 | dockerId: stdout.trim() |
| 149 | }; |
| 150 | } |
| 151 | const RUNNING_SERVERS = new Map<Array<string>, ReturnType<typeof spawnRedisServerDocker>>(); |
| 152 | |
| 153 | export interface ProxiedRedisServerDocker { |
no test coverage detected