From e23482601989a8a81d311392f741ee944c9371b9 Mon Sep 17 00:00:00 2001 From: Tetsuro Aoki Date: Mon, 26 Apr 2021 23:01:38 +0900 Subject: [PATCH] Fix docker engine v20.10.6 compatibility --- .../docker-runner/DockerContainer.js | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/lambda/handler-runner/docker-runner/DockerContainer.js b/src/lambda/handler-runner/docker-runner/DockerContainer.js index 6d007b15a..e3283ea26 100644 --- a/src/lambda/handler-runner/docker-runner/DockerContainer.js +++ b/src/lambda/handler-runner/docker-runner/DockerContainer.js @@ -174,11 +174,29 @@ export default class DockerContainer { }) }) - const { stdout: containerPortBinding } = await execa('docker', [ + // parse `docker port` output and get the container port + let containerPort + const { stdout: dockerPortOutput } = await execa('docker', [ 'port', containerId, ]) - const containerPort = containerPortBinding.split(':')[1] + // NOTE: `docker port` may output multiple lines. + // + // e.g.: + // 9001/tcp -> 0.0.0.0:49153 + // 9001/tcp -> :::49153 + // + // Parse each line until it finds the mapped port. + for (const line of dockerPortOutput.split('\n')) { + const result = line.match(/^9001\/tcp -> (.*):(\d+)$/) + if (result && result.length > 2) { + ;[, , containerPort] = result + break + } + } + if (!containerPort) { + throw new Error('Failed to get container port') + } this.#containerId = containerId this.#port = containerPort