Skip to content

Commit

Permalink
Merge pull request #58 from Microsoft/windows-shell
Browse files Browse the repository at this point in the history
Add Windows support for shell attach
  • Loading branch information
lostintangent authored Jan 31, 2017
2 parents 23eaad4 + ef4e3ac commit 1b2fe51
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 7 deletions.
18 changes: 13 additions & 5 deletions commands/open-shell-container.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
import vscode = require('vscode');
import * as vscode from 'vscode';
import {ContainerItem, quickPickContainer} from './utils/quick-pick-container';
import {DockerEngineType, docker} from './utils/docker-endpoint';

const engineTypeShellCommands = {
[DockerEngineType.Linux]: "/bin/sh",
[DockerEngineType.Windows]: "powershell"
}

export function openShellContainer() {
quickPickContainer().then(function (selectedItem: ContainerItem) {
quickPickContainer().then((selectedItem: ContainerItem) => {
if (selectedItem) {
let terminal = vscode.window.createTerminal(`sh ${selectedItem.label}`);
terminal.sendText(`docker exec -it ${selectedItem.ids[0]} /bin/sh`);
terminal.show();
docker.getEngineType().then((engineType: DockerEngineType) => {
const terminal = vscode.window.createTerminal(`Shell: ${selectedItem.label}`);
terminal.sendText(`docker exec -it ${selectedItem.ids[0]} ${engineTypeShellCommands[engineType]}`);
terminal.show();
});
}
});
}
23 changes: 22 additions & 1 deletion commands/utils/docker-endpoint.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import * as Docker from 'dockerode';

export enum DockerEngineType {
Linux,
Windows
}

class DockerClient {

private endPoint:Docker;

constructor() {
Expand Down Expand Up @@ -39,6 +42,24 @@ class DockerClient {
return this.endPoint.getContainer(id);
}

public getEngineType() : Thenable<DockerEngineType> {
if (process.platform === 'win32') {
return new Promise((resolve, reject) => {
this.endPoint.info((error, info) => {
if (error) {
return reject(error);
}

return resolve(info.OSType === "windows" ? DockerEngineType.Windows : DockerEngineType.Linux);
});
});
};

// On Linux or macOS, this can only ever be linux,
// so short-circuit the Docker call entirely.
return Promise.resolve(DockerEngineType.Linux);
}

public getImage(id:string): Docker.Image {
return this.endPoint.getImage(id);
}
Expand Down
7 changes: 6 additions & 1 deletion typings/dockerode.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ declare module Docker {
stdin?: boolean;
}

interface EngineInfo {
OSType: string;
}

interface ExecInspectData {
ExitCode: number;
}
Expand Down Expand Up @@ -69,11 +73,12 @@ declare module Docker {
}
}


declare class Docker {
modem: Docker.Modem;
constructor(options: Docker.DockerOptions);

info(cb: (err: Error, data: Docker.EngineInfo) => void): void;

listImages(cb: (err:Error , images: Docker.ImageDesc[])=>void): void;
getImage(id:string): Docker.Image;

Expand Down

0 comments on commit 1b2fe51

Please sign in to comment.