Skip to content
This repository has been archived by the owner on Oct 12, 2022. It is now read-only.

Commit

Permalink
Merge pull request #35 from Microsoft/feature/cleanupDockerfilecreation
Browse files Browse the repository at this point in the history
Simplify dockerfile creation.
  • Loading branch information
Peter Jausovec authored and Peter Jausovec committed Nov 24, 2015
2 parents f086a63 + 93cf22b commit 970cec9
Show file tree
Hide file tree
Showing 9 changed files with 153 additions and 119 deletions.
26 changes: 18 additions & 8 deletions generators/app/aspnetHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ var util = require('./utils.js');
var path = require('path');
var process = require('process');
var fs = require('fs');
var DockerfileHelper = require('./dockerfileHelper.js');

/**
* Represents a helper for ASP.NET projects.
Expand All @@ -21,6 +22,23 @@ var AspNetHelper = function(aspNetVersion, portNumber, imageName) {
this._imageName = imageName;
}

/**
* Creates dockerfile contents.
* @returns {string}
*/
AspNetHelper.prototype.createDockerfile = function() {
var _dockerfileHelper = new DockerfileHelper();
_dockerfileHelper.addFromCommand(this.getDockerImageName());
_dockerfileHelper.addCopyCommand('project.json /app/');
_dockerfileHelper.addWorkdirCommand('/app');
_dockerfileHelper.addRunCommand('["dnu", "restore"]');
_dockerfileHelper.addCopyCommand('. /app');
_dockerfileHelper.addExposeCommand(this.getPortNumber());
_dockerfileHelper.addEntrypointCommand('["dnx", "-p", "project.json", "' + this.getAspNetCommandName() + '"]');

return _dockerfileHelper.createDockerfileContents();
}

/**
* Gets the Docker image name.
* @returns {string}
Expand Down Expand Up @@ -108,14 +126,6 @@ AspNetHelper.prototype.getTemplateScriptName = function() {
return util.isWindows() ? '_dockerTaskGeneric.cmd' : '_dockerTaskGeneric.sh';
}

/**
* Gets the template Dockerfile name.
* @returns {string}
*/
AspNetHelper.prototype.getTemplateDockerfileName = function() {
return '_Dockerfile.aspnet';
}

/**
* Gets the port parameter to be used in the docker run command.
* @returns {string}
Expand Down
87 changes: 87 additions & 0 deletions generators/app/dockerfileHelper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
'use strict'

/**
* Helper for creating dockerfile contents.
* @constructor
*/
var DockerfileHelper = function() {
this._commandMap = [];
}

/**
* Adds the FROM [imagename] line.
*/
DockerfileHelper.prototype.addFromCommand = function(command) {
this._addCommand('FROM', command);
}

/**
* Adds the RUN [command] line.
*/
DockerfileHelper.prototype.addRunCommand = function(command) {
this._addCommand('RUN', command);
}

/**
* Adds COPY [command] line.
*/
DockerfileHelper.prototype.addCopyCommand = function(command) {
this._addCommand('COPY', command);
}

/**
* Adds WORKDIR [command] line.
*/
DockerfileHelper.prototype.addWorkdirCommand = function(command) {
this._addCommand('WORKDIR', command);
}

/**
* Adds ADD [command] line.
*/
DockerfileHelper.prototype.addAddCommand = function(command) {
this._addCommand('ADD', command);
}

DockerfileHelper.prototype.addExposeCommand = function(command) {
this._addCommand('EXPOSE', command);
}

/**
* Adds ENTRYPOINT [command] line.
*/
DockerfileHelper.prototype.addEntrypointCommand = function(command) {
this._addCommand('ENTRYPOINT', command);
}

/**
* Adds CMD [command] line.
*/
DockerfileHelper.prototype.addCmdCommand = function(command) {
this._addCommand('CMD', command);
}

/**
* Iterates through the array of commands and creates the contents.
*/
DockerfileHelper.prototype.createDockerfileContents = function() {
var contents = '';
for (var i = 0; i < this._commandMap.length; i ++) {
var item = this._commandMap[i];
contents += item.commandName + ' ' + item.value + '\n';
}

return contents;
}

/**
* Adds the command name and value to the list of commands.
*/
DockerfileHelper.prototype._addCommand = function(commandName, value) {
this._commandMap.push({ commandName: commandName, value: value });
}

module.exports = DockerfileHelper;
24 changes: 16 additions & 8 deletions generators/app/golangHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
var util = require('./utils.js');
var path = require('path');
var process = require('process');
var DockerfileHelper = require('./dockerfileHelper.js');

/**
* Represents a helper for Golang projects.
Expand All @@ -20,6 +21,21 @@ var GolangHelper = function(isWeb, portNumber, imageName) {
this._imageName = imageName;
}

/**
* Creates dockerfile contents.
* @returns {string}
*/
GolangHelper.prototype.createDockerfile = function() {
var projectName = this.getProjectName();
var _dockerfileHelper = new DockerfileHelper();
_dockerfileHelper.addFromCommand(this.getDockerImageName());
_dockerfileHelper.addAddCommand('. /go/src/github.com/' + projectName);
_dockerfileHelper.addRunCommand('go install github.com/' + projectName);
_dockerfileHelper.addEntrypointCommand('/go/bin/' + projectName);

return _dockerfileHelper.createDockerfileContents();
}

/**
* Gets the Docker image name.
* @returns {string}
Expand Down Expand Up @@ -52,14 +68,6 @@ GolangHelper.prototype.getTemplateScriptName = function() {
return util.isWindows() ? '_dockerTaskGolang.cmd' : '_dockerTaskGolang.sh';
}

/**
* Gets the template Dockerfile name.
* @returns {string}
*/
GolangHelper.prototype.getTemplateDockerfileName = function() {
return '_Dockerfile.golang';
}

/**
* Gets the project name (this is used in the Dockerfile).
* @returns {string}
Expand Down
31 changes: 8 additions & 23 deletions generators/app/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,20 +130,14 @@ function handleNodeJs(yo) {
return;
}

yo.fs.copyTpl(
yo.templatePath(nodeJs.getTemplateDockerfileName()),
yo.destinationPath(DOCKERFILE_NAME), {
imageName: nodeJs.getDockerImageName(),
nodemonCommand: nodeJs.getNodemonCommand(),
portNumber: nodeJs.getPortNumber(),
runCommand: nodeJs.getDockerfileRunCommand()
});
var contents = nodeJs.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(contents));

yo.fs.copyTpl(
yo.templatePath(nodeJs.getTemplateScriptName()),
yo.destinationPath(util.getDestinationScriptName()), {
imageName: nodeJs.getImageName(),
portNumber: nodeJs.getPortNumber(),
imageName: imageName,
portNumber: portNumber,
containerRunCommand: nodeJs.getContainerRunCommand()
});
}
Expand All @@ -153,13 +147,9 @@ function handleNodeJs(yo) {
*/
function handleGolang(yo) {
var golang = new GolangHelper(isGoWeb, portNumber, imageName);
var contents = golang.createDockerfile();

yo.fs.copyTpl(
yo.templatePath(golang.getTemplateDockerfileName()),
yo.destinationPath(DOCKERFILE_NAME), {
imageName: golang.getDockerImageName(),
projectName: golang.getProjectName()
});
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(contents));

yo.fs.copyTpl(
yo.templatePath(golang.getTemplateScriptName()),
Expand Down Expand Up @@ -187,13 +177,8 @@ function handleAspNet(yo) {
done();
}.bind(yo));

yo.fs.copyTpl(
yo.templatePath(aspNet.getTemplateDockerfileName()),
yo.destinationPath(DOCKERFILE_NAME), {
imageName: aspNet.getDockerImageName(),
portNumber: aspNet.getPortNumber(),
aspNetCommandName: aspNet.getAspNetCommandName()
});
var contents = aspNet.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(contents));

yo.fs.copyTpl(
yo.templatePath(aspNet.getTemplateScriptName()),
Expand Down
60 changes: 24 additions & 36 deletions generators/app/nodejsHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
var util = require('./utils.js');
var path = require('path');
var process = require('process');
var DockerfileHelper = require('./dockerfileHelper.js');

/**
* Represents a helper for Node.js projects.
Expand All @@ -21,43 +22,38 @@ var NodejsHelper = function(useNodemon, portNumber, imageName) {
}

/**
* Gets the Docker image name.
* Creates dockerfile contents.
* @returns {string}
*/
NodejsHelper.prototype.getDockerImageName = function() {
return 'node';
}
NodejsHelper.prototype.createDockerfile = function() {
var _dockerfileHelper = new DockerfileHelper();
_dockerfileHelper.addFromCommand(this.getDockerImageName());
_dockerfileHelper.addRunCommand('mkdir /src');
_dockerfileHelper.addAddCommand('. /src');
_dockerfileHelper.addWorkdirCommand('/src');
_dockerfileHelper.addExposeCommand(this._portNumber);

/**
* Gets the port number.
* @returns {int}
*/
NodejsHelper.prototype.getPortNumber = function() {
return this._portNumber;
}

/**
* Gets the app image name.
* @returns {string}
*/
NodejsHelper.prototype.getImageName = function() {
return this._imageName;
}
if (this._useNodemon) {
_dockerfileHelper.addRunCommand('npm install nodemon -g');
}

/**
* Gets run command to be used in the Dockerfile.
* @returns {string}
*/
NodejsHelper.prototype.getDockerfileRunCommand = function() {
return this._useNodemon ? 'CMD ["nodemon"]' : 'CMD ["node", "./bin/www"]';
_dockerfileHelper.addRunCommand('npm install');

if (this._useNodemon) {
_dockerfileHelper.addCmdCommand('["nodemon"]');
} else {
_dockerfileHelper.addCmdCommand('["node", "./bin/www"]');
}

return _dockerfileHelper.createDockerfileContents();
}

/**
* Gets the Nodemon command to be used in the Dockerfile.
* Gets the Docker image name.
* @returns {string}
*/
NodejsHelper.prototype.getNodemonCommand = function() {
return this._useNodemon ? 'RUN npm install nodemon -g' : '';
NodejsHelper.prototype.getDockerImageName = function() {
return 'node';
}

/**
Expand All @@ -68,14 +64,6 @@ NodejsHelper.prototype.getTemplateScriptName = function() {
return util.isWindows() ? '_dockerTaskGeneric.cmd' : '_dockerTaskGeneric.sh';
}

/**
* Gets the template Dockerfile name.
* @returns {string}
*/
NodejsHelper.prototype.getTemplateDockerfileName = function() {
return '_Dockerfile.nodejs';
}

/**
* Gets the parameter for volume sharing used in the docker run command.
* @returns {string}
Expand Down
9 changes: 0 additions & 9 deletions generators/app/templates/_Dockerfile.aspnet

This file was deleted.

11 changes: 0 additions & 11 deletions generators/app/templates/_Dockerfile.golang

This file was deleted.

21 changes: 0 additions & 21 deletions generators/app/templates/_Dockerfile.nodejs

This file was deleted.

3 changes: 0 additions & 3 deletions generators/app/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@

'use strict';
var os = require('os');
var path = require('path');
var process = require('process');
var fs = require('fs');

module.exports = {
/**
Expand Down

0 comments on commit 970cec9

Please sign in to comment.