|
1 | 1 | import archiver from "archiver"; |
2 | 2 | import AsyncLock from "async-lock"; |
3 | | -import { Container, ContainerCreateOptions, ContainerInspectInfo, HostConfig } from "dockerode"; |
| 3 | +import { Container, ContainerCreateOptions, HostConfig } from "dockerode"; |
4 | 4 | import { Readable } from "stream"; |
5 | | -import { containerLog, hash, IntervalRetry, log, toNanos } from "../common"; |
| 5 | +import { containerLog, hash, log, toNanos } from "../common"; |
6 | 6 | import { ContainerRuntimeClient, getContainerRuntimeClient, ImageName } from "../container-runtime"; |
7 | 7 | import { CONTAINER_STATUSES } from "../container-runtime/clients/container/types"; |
8 | 8 | import { StartedNetwork } from "../network/network"; |
@@ -33,6 +33,7 @@ import { Wait } from "../wait-strategies/wait"; |
33 | 33 | import { waitForContainer } from "../wait-strategies/wait-for-container"; |
34 | 34 | import { WaitStrategy } from "../wait-strategies/wait-strategy"; |
35 | 35 | import { GenericContainerBuilder } from "./generic-container-builder"; |
| 36 | +import { inspectContainerUntilPortsExposed } from "./inspect-container-util-ports-exposed"; |
36 | 37 | import { StartedGenericContainer } from "./started-generic-container"; |
37 | 38 |
|
38 | 39 | const reusableContainerCreationLock = new AsyncLock(); |
@@ -141,7 +142,13 @@ export class GenericContainer implements TestContainer { |
141 | 142 | if (!inspectResult.State.Running) { |
142 | 143 | log.debug("Reused container is not running, attempting to start it"); |
143 | 144 | await client.container.start(container); |
144 | | - inspectResult = (await this.inspectContainer(client, container)).inspectResult; |
| 145 | + inspectResult = ( |
| 146 | + await inspectContainerUntilPortsExposed( |
| 147 | + () => client.container.inspect(container), |
| 148 | + this.exposedPorts, |
| 149 | + container.id |
| 150 | + ) |
| 151 | + ).inspectResult; |
145 | 152 | } |
146 | 153 |
|
147 | 154 | const mappedInspectResult = mapInspectResult(inspectResult); |
@@ -195,7 +202,11 @@ export class GenericContainer implements TestContainer { |
195 | 202 | await client.container.start(container); |
196 | 203 | log.info(`Started container for image "${this.createOpts.Image}"`, { containerId: container.id }); |
197 | 204 |
|
198 | | - const { inspectResult, mappedInspectResult } = await this.inspectContainer(client, container); |
| 205 | + const { inspectResult, mappedInspectResult } = await inspectContainerUntilPortsExposed( |
| 206 | + () => client.container.inspect(container), |
| 207 | + this.exposedPorts, |
| 208 | + container.id |
| 209 | + ); |
199 | 210 | const boundPorts = BoundPorts.fromInspectResult(client.info.containerRuntime.hostIps, mappedInspectResult).filter( |
200 | 211 | this.exposedPorts |
201 | 212 | ); |
@@ -239,48 +250,6 @@ export class GenericContainer implements TestContainer { |
239 | 250 | return startedContainer; |
240 | 251 | } |
241 | 252 |
|
242 | | - private async inspectContainer( |
243 | | - client: ContainerRuntimeClient, |
244 | | - container: Container |
245 | | - ): Promise<{ |
246 | | - inspectResult: ContainerInspectInfo; |
247 | | - mappedInspectResult: InspectResult; |
248 | | - }> { |
249 | | - const containerInspectRetry = await new IntervalRetry< |
250 | | - { |
251 | | - inspectResult: ContainerInspectInfo; |
252 | | - mappedInspectResult: InspectResult; |
253 | | - }, |
254 | | - Error |
255 | | - >(100).retryUntil( |
256 | | - async () => { |
257 | | - const inspectResult = await client.container.inspect(container); |
258 | | - const mappedInspectResult = mapInspectResult(inspectResult); |
259 | | - return { inspectResult, mappedInspectResult }; |
260 | | - }, |
261 | | - ({ mappedInspectResult }) => |
262 | | - this.exposedPorts |
263 | | - .map((exposedPort) => getContainerPort(exposedPort)) |
264 | | - .every( |
265 | | - (exposedPort) => |
266 | | - mappedInspectResult.ports[exposedPort].length > 0 && |
267 | | - mappedInspectResult.ports[exposedPort].every(({ hostPort }) => hostPort !== undefined) |
268 | | - ), |
269 | | - () => { |
270 | | - const message = `Container did not expose all ports after starting`; |
271 | | - log.error(message, { containerId: container.id }); |
272 | | - return new Error(message); |
273 | | - }, |
274 | | - 3000 |
275 | | - ); |
276 | | - |
277 | | - if (containerInspectRetry instanceof Error) { |
278 | | - throw containerInspectRetry; |
279 | | - } |
280 | | - |
281 | | - return containerInspectRetry; |
282 | | - } |
283 | | - |
284 | 253 | private async connectContainerToPortForwarder(client: ContainerRuntimeClient, container: Container) { |
285 | 254 | const portForwarder = await PortForwarderInstance.getInstance(); |
286 | 255 | const portForwarderNetworkId = portForwarder.getNetworkId(); |
|
0 commit comments