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 #36 from Microsoft/feature/composefileCreation
Browse files Browse the repository at this point in the history
Creating a simple docker-compose.yml file as part of the experience.
  • Loading branch information
Peter Jausovec authored and Peter Jausovec committed Nov 24, 2015
2 parents 970cec9 + 376d763 commit fe1c6ad
Show file tree
Hide file tree
Showing 12 changed files with 330 additions and 6 deletions.
14 changes: 14 additions & 0 deletions generators/app/aspnetHelper.js
Expand Up @@ -8,6 +8,7 @@ var path = require('path');
var process = require('process');
var fs = require('fs');
var DockerfileHelper = require('./dockerfileHelper.js');
var DockerComposeHelper = require('./dockerComposeHelper.js');

/**
* Represents a helper for ASP.NET projects.
Expand Down Expand Up @@ -39,6 +40,19 @@ AspNetHelper.prototype.createDockerfile = function() {
return _dockerfileHelper.createDockerfileContents();
}

/**
* Creates docker-compose file contents.
* @returns {string}
*/
AspNetHelper.prototype.createDockerComposeFile = function() {
var _dockerComposeHelper = new DockerComposeHelper();
_dockerComposeHelper.addAppName(this._imageName);
_dockerComposeHelper.addDockerfile('Dockerfile');
_dockerComposeHelper.addBuildContext('.');
_dockerComposeHelper.addPort(this._portNumber + ':' + this._portNumber);
return _dockerComposeHelper.createContents();
}

/**
* Gets the Docker image name.
* @returns {string}
Expand Down
87 changes: 87 additions & 0 deletions generators/app/dockerComposeHelper.js
@@ -0,0 +1,87 @@
/*---------------------------------------------------------
* Copyright (C) Microsoft Corporation. All rights reserved.
*--------------------------------------------------------*/
'use strict'

/**
* Helper for creating docker-compose file contents.
* @constructor
*/
var DockerComposeHelper = function() {
this._commandMap = [];
}

DockerComposeHelper.prototype.addAppName = function(name) {
this._addCommand('', name);
}

DockerComposeHelper.prototype.addDockerfile = function(fileName) {
this._addCommand('dockerfile', fileName);
}

DockerComposeHelper.prototype.addBuildContext = function(context) {
this._addCommand('build', context);
}

DockerComposeHelper.prototype.addPort = function(ports) {
this._addCommand('ports', ports);
}

DockerComposeHelper.prototype.addVolume = function(volume) {
this._addCommand('volumes', volume);
}

/**
* Iterates through the array of commands and creates the contents.
*/
DockerComposeHelper.prototype.createContents = function() {
var contents = '';

for (var i = 0; i < this._commandMap.length; i ++) {
var item = this._commandMap[i];

switch (item.commandName) {
case '': {
// [VALUE]:
contents += item.value + ':\n';
break;
}

case 'ports': {
if (contents.indexOf(item.commandName) === -1) {
// Add 'ports:' first.
contents += ' ' + item.commandName + ':\n';
}

contents += ' - "' + item.value + '"\n';
break;
}
case 'volumes': {
if (contents.indexOf(item.commandName) === -1) {
// Add 'volumes:' first.
contents += ' ' + item.commandName + ':\n';
}

contents += ' - ' + item.value + '\n';
break;
}

default: {
// [COMMANDNAME]: [VALUE]
contents += ' ' + item.commandName + ': ' + item.value + '\n';
break;
}
}
}

return contents;
}

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

module.exports = DockerComposeHelper;
18 changes: 18 additions & 0 deletions generators/app/golangHelper.js
Expand Up @@ -7,6 +7,7 @@ var util = require('./utils.js');
var path = require('path');
var process = require('process');
var DockerfileHelper = require('./dockerfileHelper.js');
var DockerComposeHelper = require('./dockerComposeHelper.js');

/**
* Represents a helper for Golang projects.
Expand Down Expand Up @@ -36,6 +37,23 @@ GolangHelper.prototype.createDockerfile = function() {
return _dockerfileHelper.createDockerfileContents();
}

/**
* Creates docker-compose file contents.
* @returns {string}
*/
GolangHelper.prototype.createDockerComposeFile = function() {
var _dockerComposeHelper = new DockerComposeHelper();
_dockerComposeHelper.addAppName(this._imageName);
_dockerComposeHelper.addDockerfile('Dockerfile');
_dockerComposeHelper.addBuildContext('.');

if (this._isWeb) {
_dockerComposeHelper.addPort(this._portNumber + ':' + this._portNumber);
}

return _dockerComposeHelper.createContents();
}

/**
* Gets the Docker image name.
* @returns {string}
Expand Down
22 changes: 16 additions & 6 deletions generators/app/index.js
Expand Up @@ -25,6 +25,7 @@ var error = false;
var portNumber = 3000;
var imageName = '';
var DOCKERFILE_NAME = 'Dockerfile';
var DOCKERCOMPOSE_NAME = 'docker-compose.yml';

// Node.js variables
var addNodemon = false;
Expand Down Expand Up @@ -130,8 +131,11 @@ function handleNodeJs(yo) {
return;
}

var contents = nodeJs.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(contents));
var dockerfileContents = nodeJs.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(dockerfileContents));

var dockerComposeContents = nodeJs.createDockerComposeFile();
yo.fs.write(yo.destinationPath('docker-compose.yml'), new Buffer(dockerComposeContents));

yo.fs.copyTpl(
yo.templatePath(nodeJs.getTemplateScriptName()),
Expand All @@ -147,9 +151,12 @@ function handleNodeJs(yo) {
*/
function handleGolang(yo) {
var golang = new GolangHelper(isGoWeb, portNumber, imageName);
var contents = golang.createDockerfile();

yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(contents));
var dockerfileContents = golang.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(dockerfileContents));

var dockerComposeContents = golang.createDockerComposeFile();
yo.fs.write(yo.destinationPath(DOCKERCOMPOSE_NAME), new Buffer(dockerComposeContents));

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

var contents = aspNet.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(contents));
var dockerfileContents = aspNet.createDockerfile();
yo.fs.write(yo.destinationPath(DOCKERFILE_NAME), new Buffer(dockerfileContents));

var dockerComposeContents = aspNet.createDockerComposeFile();
yo.fs.write(yo.destinationPath(DOCKERCOMPOSE_NAME), new Buffer(dockerComposeContents));

yo.fs.copyTpl(
yo.templatePath(aspNet.getTemplateScriptName()),
Expand Down
24 changes: 24 additions & 0 deletions generators/app/nodejsHelper.js
Expand Up @@ -7,6 +7,7 @@ var util = require('./utils.js');
var path = require('path');
var process = require('process');
var DockerfileHelper = require('./dockerfileHelper.js');
var DockerComposeHelper = require('./dockerComposeHelper.js');

/**
* Represents a helper for Node.js projects.
Expand Down Expand Up @@ -48,6 +49,29 @@ NodejsHelper.prototype.createDockerfile = function() {
return _dockerfileHelper.createDockerfileContents();
}

/**
* Creates docker-compose file contents.
* @returns {string}
*/
NodejsHelper.prototype.createDockerComposeFile = function() {
var _dockerComposeHelper = new DockerComposeHelper();
_dockerComposeHelper.addAppName(this._imageName);
_dockerComposeHelper.addDockerfile('Dockerfile');
_dockerComposeHelper.addBuildContext('.');
_dockerComposeHelper.addPort(this._portNumber + ':' + this._portNumber);

if (this._useNodemon) {
if (util.isWindows()) {
var sourcePath = '/' + process.cwd().replace(path.sep, '/');
_dockerComposeHelper.addVolume(sourcePath + ':/src');
} else {
_dockerComposeHelper.addVolume('.:/src');
}
}

return _dockerComposeHelper.createContents();
}

/**
* Gets the Docker image name.
* @returns {string}
Expand Down
12 changes: 12 additions & 0 deletions generators/app/templates/_dockerTaskGeneric.cmd
Expand Up @@ -3,6 +3,11 @@ set imageName="<%= imageName %>"
set containerPort=<%= portNumber %>
set publicPort=<%= portNumber %>

if /I "%1" == "compose" (
call :compose
goto :eof
)

if /I "%1" == "build" (
call :buildImage
goto :eof
Expand Down Expand Up @@ -45,6 +50,12 @@ REM Builds the Docker image.
docker build -t %imageName% .
goto :eof

REM Runs docker-compose.
:compose
echo Composing.
docker-compose up -d
goto :eof

REM Runs the container.
:runContainer
REM Check if container is already running, stop it and run a new one.
Expand Down Expand Up @@ -78,6 +89,7 @@ REM Shows the usage for the script.
echo build: Builds a Docker image (%imageName%).
echo run: Runs a container based on an existing Docker image (%imageName%).
echo buildrun: Builds a Docker image and runs the container.
echo compose: Runs docker-compose.
echo clean: Removes the image %imageName% and kills all containers based on that image.
echo Example:
echo dockerTask.cmd build
Expand Down
13 changes: 13 additions & 0 deletions generators/app/templates/_dockerTaskGeneric.sh
Expand Up @@ -15,14 +15,23 @@ buildImage () {
docker build -t $imageName .
}

# Runs docker-compose.
compose () {
echo "Composing."
docker-compose up -d
_openSite
}

# Runs the container.
runContainer () {
# Check if container is already running, stop it and run a new one.
docker kill $(docker ps -a | awk '{ print $1,$2 }' | grep $imageName | awk '{ print $1}') > /dev/null 2>&1;

# Create a container from the image.
<%= containerRunCommand %>
}

_openSite () {
printf 'Opening site'
until $(curl --output /dev/null --silent --head --fail http://$(docker-machine ip $(docker-machine active)):$publicPort); do
printf '.'
Expand All @@ -42,6 +51,7 @@ showUsage () {
echo " build: Builds a Docker image ('$imageName')."
echo " run: Runs a container based on an existing Docker image ('$imageName')."
echo " buildrun: Builds a Docker image and runs the container."
echo " compose: Runs docker-compose."
echo " clean: Removes the image '$imageName' and kills all containers based on that image."
echo ""
echo "Example:"
Expand All @@ -55,6 +65,9 @@ if [ $# -eq 0 ]; then
showUsage
else
case "$1" in
"compose")
compose
;;
"build")
buildImage
;;
Expand Down
12 changes: 12 additions & 0 deletions generators/app/templates/_dockerTaskGolang.cmd
Expand Up @@ -2,6 +2,11 @@
set imageName="<%= imageName %>"
set dockerHostName="<%= dockerHostName %>"

if /I "%1" == "compose" (
call :compose
goto :eof
)

if /I "%1" == "build" (
call :buildImage
goto :eof
Expand Down Expand Up @@ -44,6 +49,12 @@ REM Builds the Docker image.
docker build -t %imageName% .
goto :eof

REM Runs docker-compose.
:compose
echo Composing.
docker-compose up -d
goto :eof

REM Runs the container.
:runContainer
REM Check if container is already running, stop it and run a new one.
Expand All @@ -67,6 +78,7 @@ REM Shows the usage for the script.
echo build: Builds a Docker image (%imageName%).
echo run: Runs a container based on an existing Docker image (%imageName%).
echo buildrun: Builds a Docker image and runs the container.
echo compose: Runs docker-compose.
echo clean: Removes the image %imageName% and kills all containers based on that image.
echo Example:
echo dockerTask.cmd build
Expand Down
11 changes: 11 additions & 0 deletions generators/app/templates/_dockerTaskGolang.sh
Expand Up @@ -13,6 +13,13 @@ buildImage () {
docker build -t $imageName .
}

# Runs docker-compose.
compose () {
echo "Composing."
docker-compose up -d
<%= openWebSiteCommand %>
}

# Runs the container.
runContainer () {
# Check if container is already running, stop it and run a new one.
Expand All @@ -32,6 +39,7 @@ showUsage () {
echo " build: Builds a Docker image ('$imageName')."
echo " run: Runs a container based on an existing Docker image ('$imageName')."
echo " buildrun: Builds a Docker image and runs the container."
echo " compose: Runs docker-compose."
echo " clean: Removes the image '$imageName' and kills all containers based on that image."
echo ""
echo "Example:"
Expand All @@ -45,6 +53,9 @@ if [ $# -eq 0 ]; then
showUsage
else
case "$1" in
"compose")
compose
;;
"build")
buildImage
;;
Expand Down

0 comments on commit fe1c6ad

Please sign in to comment.