in src/invoker.js [282:383]
async startContainer(debug) {
if (!await this.isImagePresent(this.image, debug)) {
// show after 8 seconds, as VS code will timeout after 10 secs by default,
// so that the user can see it after all the "docker pull" progress output
setTimeout(() => {
log.warn(`
+------------------------------------------------------------------------------------------+
| Docker image being downloaded: ${this.image}
| |
| Note: If you debug in VS Code and it fails with "Cannot connect to runtime process" |
| due to a timeout, run this command once: |
| |
| docker pull ${this.image}
| |
| Alternatively set a higher 'timeout' in the launch configuration, such as 60000 (1 min). |
+------------------------------------------------------------------------------------------+
`);
}, 8000);
debug(`Pulling ${this.image}`)
log.spinner(`Pulling ${this.image}...`);
await this.pull(this.image);
debug("Pull complete");
}
await this.checkExistingContainers();
log.spinner('Starting container');
// links for docker create container config:
// docker api: https://docs.docker.com/engine/api/v1.37/#operation/ContainerCreate
// docker run impl: https://github.com/docker/cli/blob/2c3797015f5e7ef4502235b638d161279c471a8d/cli/command/container/run.go#L33
// https://github.com/apocas/dockerode/issues/257
// https://github.com/apocas/dockerode/blob/master/lib/docker.js#L1442
// https://medium.com/@johnnyeric/how-to-reproduce-command-docker-run-via-docker-remote-api-with-node-js-5918d7b221ea
const containerRuntimePort = `${RUNTIME_PORT}/tcp`;
const hostRuntimePort = await getPort();
const ipAddress = process.env.DOCKER_HOST_IP || "0.0.0.0";
this.containerURL = `http://${ipAddress}:${hostRuntimePort}`;
const containerDebugPort = `${this.debug.internalPort}/tcp`;
const createContainerConfig = {
name: this.containerName,
Labels: {
[LABEL_ACTION_NAME]: this.getFullActionName()
},
Image: this.image,
Cmd: [ 'sh', '-c', this.debug.command ],
Env: [],
Volumes: {},
ExposedPorts: {
[containerRuntimePort]: {},
[containerDebugPort]: {}
},
HostConfig: {
AutoRemove: true,
PortBindings: {
[containerRuntimePort]: [{ HostPort: `${hostRuntimePort}` }],
[containerDebugPort]: [{ HostPort: `${this.debug.port}` }]
},
Memory: this.memory,
Binds: []
}
};
if (this.debug.updateContainerConfig) {
this.debug.updateContainerConfig(this, createContainerConfig);
}
dockerUtils.dockerRunArgs2CreateContainerConfig(this.dockerArgsFromUser, createContainerConfig);
debug("docker - creating container:", createContainerConfig);
this.container = await this.docker.createContainer(createContainerConfig);
const stream = await this.container.attach({
stream: true,
stdout: true,
stderr: true
});
const spinnerSafeStream = (stream) => ({
write: (data) => {
log.stopSpinner();
stream(data.toString().replace(/\n$/, ""));
log.resumeSpinner();
}
});
this.container.modem.demuxStream(
stream,
spinnerSafeStream(console.log),
spinnerSafeStream(console.error)
);
await this.container.start();
debug(`docker - started container ${this.container.id}`);
}