This commit is contained in:
Misty Stanley-Jones 2016-09-28 16:43:46 -07:00
commit eaf7fc7244
340 changed files with 20060 additions and 53 deletions

110
.eslintrc Normal file
View File

@ -0,0 +1,110 @@
root: true
plugins:
- react
ecmaFeatures:
modules: true
jsx: true
arrowFunctions: true
blockBindings: true
env:
node: true
es6: true
browser: true
jest: true
extends:
"eslint:recommended"
rules:
indent: [2, 2, {SwitchCase: 1}]
brace-style: [2, "1tbs"]
camelcase: [2, { properties: "never" }]
callback-return: [2, ["cb", "callback", "next"]]
comma-spacing: 2
comma-style: [2, "last"]
consistent-return: 2
curly: [2, "all"]
default-case: 2
dot-notation: [2, { allowKeywords: true }]
eol-last: 2
eqeqeq: 2
func-style: [2, "declaration"]
guard-for-in: 2
key-spacing: [2, { beforeColon: false, afterColon: true }]
new-cap: 2
new-parens: 2
no-alert: 2
no-array-constructor: 2
no-caller: 2
no-console: 0
no-delete-var: 2
no-empty-label: 2
no-eval: 2
no-extend-native: 2
no-extra-bind: 2
no-fallthrough: 2
no-floating-decimal: 2
no-implied-eval: 2
no-invalid-this: 2
no-iterator: 2
no-label-var: 2
no-labels: 2
no-lone-blocks: 2
no-loop-func: 2
no-mixed-spaces-and-tabs: [2, false]
no-multi-spaces: 2
no-multi-str: 2
no-native-reassign: 2
no-nested-ternary: 2
no-new: 2
no-new-func: 2
no-new-object: 2
no-new-wrappers: 2
no-octal: 2
no-octal-escape: 2
no-process-exit: 2
no-proto: 2
no-redeclare: 2
no-return-assign: 2
no-script-url: 2
no-sequences: 2
no-shadow: 2
no-shadow-restricted-names: 2
no-spaced-func: 2
no-trailing-spaces: 2
no-undef: 2
no-undef-init: 2
no-undefined: 2
no-underscore-dangle: 2
no-unused-expressions: 2
no-unused-vars: [2, {vars: "all", args: "after-used"}]
no-use-before-define: 2
no-with: 2
quotes: [2, "single"]
radix: 2
semi: 2
semi-spacing: [2, {before: false, after: true}]
space-after-keywords: [2, "always"]
space-before-blocks: 2
space-before-function-paren: [2, "always"]
space-infix-ops: 2
space-return-throw-case: 2
space-unary-ops: [2, {words: true, nonwords: false}]
spaced-comment: [2, "always", { exceptions: ["-"]}]
strict: [2, "global"]
valid-jsdoc: [2, { prefer: { "return": "returns"}}]
wrap-iife: 2
yoda: [2, "never"]
# Previously on by default in node environment
no-catch-shadow: 0
no-console: 0
no-mixed-requires: 2
no-new-require: 2
no-path-concat: 2
no-process-exit: 2
global-strict: [0, "always"]
handle-callback-err: [2, "err"]

11
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,11 @@
### Expected behavior
### Actual behavior
### Information about the Issue
### Steps to reproduce the behavior
1. ...
2. ...

53
.gitignore vendored
View File

@ -1,53 +0,0 @@
###Go###
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so
*.swo
*.swp
# Folders
_obj
_test
# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out
*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*
_testmain.go
*.exe
*.test
###OSX###
.DS_Store
.AppleDouble
.LSOverride
# Icon must ends with two \r.
Icon
# Thumbnails
._*
Thumb.db
# Files that might appear on external disk
.Spotlight-V100
.Trashes
maintainers/maintainers
maintainers/MAINTAINERS
# go generated files
maintainers/rules.go
maintainers/roles.go

13
.travis.yml Normal file
View File

@ -0,0 +1,13 @@
sudo: false
language: node_js
node_js:
- "4.2.2"
cache:
directories:
- node_modules
script:
- npm install
- npm test

136
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,136 @@
# Contributing to Kitematic
Thanks for contributing and supporting the Kitematic project!
Before you file an issue or a pull request, read the following tips on how to keep development of the project awesome for all of the contributors:
## Table of Contents
- [Mac Prerequisites](#prerequisites-for-developing-kitematic-on-mac)
- [Windows Prerequisites](#prerequisites-for-developing-kitematic-on-windows)
- [Getting Started](#getting-started)
- [Architecture](#architecture)
- [GitHub Issues](#github-issues)
- [Pull Requests](#pull-requests)
- [Code Guidelines](#code-guidelines)
- [Testing](#testing)
- [License](#license)
### Prerequisites for developing Kitematic on Mac
You will need to install:
- The [Docker Toolbox](https://docker.com/toolbox)
- [Node.js](https://nodejs.org/)
- Wine `brew install wine` (only if you want to generate a Windows release on OS X)
- The latest Xcode from the Apple App Store.
### Prerequisites for developing Kitematic on Windows
You will need to install:
- The [Docker Toolbox](https://docker.com/toolbox)
- [Node.js](https://nodejs.org/)
- Open a command prompt (`cmd`) and run the command `mkdir ~/AppData/Roaming/npm`
- [Visual Studio 2013 Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) (or similar) - You do not need to install any optional packages during install.
- [Python](https://www.python.org/downloads/release/python-2710/)
![Toolbox Env Var](https://cloud.githubusercontent.com/assets/251292/10656552/adaedb20-7834-11e5-8881-d5402d3fee37.png)
### Getting Started
- `npm install`
To run the app in development:
- `npm start`
Running `npm start` will download and install the Docker client,
[Docker Machine](https://github.com/docker/machine), [Docker Compose](https://github.com/docker/compose)
the [Boot2Docker iso](https://github.com/boot2docker/boot2docker),
[Electron](http://electron.atom.io/).
### Building & Release
- `npm run release`
### Unit Tests
- `npm test`
## Architecture
### Overview
**Note: This architecture is work in progress and doesn't reflect the current state of the app, yet!**
Kitematic is an application built using [electron](https://github.com/atom/electron) and is powered by the [Docker Engine](https://github.com/docker/docker). While it's work in progress, the goal is to make Kitematic a high-performance, portable Javascript ES6 application built with React and Flux (using [alt](https://github.com/goatslacker/alt). It adopts a single data flow pattern:
```
╔═════════╗ ╔════════╗ ╔═════════════════╗
║ Actions ║──────>║ Stores ║──────>║ View Components ║
╚═════════╝ ╚════════╝ ╚═════════════════╝
^ │
└──────────────────────────────────────┘
```
There are three primary types of objects:
- **Actions**: Interact with the system (Docker Engine, Docker Machine, Registries, Hub, etc)
- **Views**: Views make up the UI, and trigger available actions.
- **Stores**: Stores store the state of the application.
and since Kitematic has a large amount of interaction with outside systems, we've added utils:
- **Utils**: Utils interact with APIs, outside systems, CLI tools and generate. They are called by user-generated actions and in return, also create actions based on API return values, CLI output etc.
### Guidelines
- Avoid asynchronous code in Actions, Stores or Views. Instead, put code involving callbacks, promises or generators in utils or actions.
## GitHub Issues
Please try and label any issue as:
- `bug`: clearly a defect or unwanted behavior (errors, performance issues)
- `enhancement`: making an existing, working feature better (UI improvements, better integration)
- `feature`: an entirely new feature. Please work on [roadmap features](https://github.com/kitematic/kitematic/blob/master/ROADMAP.md).
Before creating an issue, please:
1. **Search the existing issues** to see if an issue already exists (and if so, throw in a handy :+1:)!
2. **Make sure you're running the latest version of Kitematic**. The bug may already be fixed!
3. **Explain how to reproduce the bug**. This will save maintainers tons of time!
Please be as detailed as possible. Include a description of your environment and steps on how to reproduce a bug.
## Pull Requests
We're thrilled to receive pull requests of any kind. Anything from bug fix, tests or new features are welcome.
That said, please let us know what you're planning to do! For large changes always create a proposal. Maintainers will love to give you advice on building it and it keeps the app's design coherent.
### Pull Request Requirements:
- Includes tests
- [Signed Off](https://github.com/docker/docker/blob/master/CONTRIBUTING.md#sign-your-work)
## Testing
Please try to test any new code.
- Tests can be run using `npm test`
- Kitematic uses the [Jest framework](https://facebook.github.io/jest/) by Facebook. To keep tests fast, please mock as much as possible.
## Code Guidelines
### Javascript
Kitematic is es6 ready. Please use es6 constructs where possible, they are powerful and make the code more succinct, understandable and fun.
- Semicolons
- 2 spaces (no tabs)
#### Checking Javascript code standards with JSHint
Run `npm run lint` before committing to ensure your javascript is up to standard. Feel free to suggest changes to the lint spec in `.jshint`.
We designed Kitematic to be easy to build, extend and distribute for developers.
## License
By contributing your code, you agree to license your contribution under the [Apache license](https://github.com/kitematic/kitematic/blob/master/LICENSE).

421
Gruntfile.js Normal file
View File

@ -0,0 +1,421 @@
var fs = require('fs');
var path = require('path');
var execFile = require('child_process').execFile;
var packagejson = require('./package.json');
var electron = require('electron-prebuilt');
module.exports = function (grunt) {
require('load-grunt-tasks')(grunt);
var target = grunt.option('target') || 'development';
var beta = grunt.option('beta') || false;
var alpha = grunt.option('alpha') || false;
var env = process.env;
env.NODE_PATH = '..:' + env.NODE_PATH;
env.NODE_ENV = target;
var certificateFile = grunt.option('certificateFile');
var version = function (str) {
var match = str.match(/(\d+\.\d+\.\d+)/);
return match ? match[1] : null;
};
var BASENAME = 'Kitematic';
var OSX_APPNAME = BASENAME + ' (Beta)';
var WINDOWS_APPNAME = BASENAME + ' (Alpha)';
var LINUX_APPNAME = BASENAME + ' (Alpha)';
var OSX_OUT = './dist';
var OSX_OUT_X64 = OSX_OUT + '/' + OSX_APPNAME + '-darwin-x64';
var OSX_FILENAME = OSX_OUT_X64 + '/' + OSX_APPNAME + '.app';
var LINUX_FILENAME = OSX_OUT + '/' + BASENAME + '_' + packagejson.version + '_amd64.deb';
var IS_WINDOWS = process.platform === 'win32';
var IS_LINUX = process.platform === 'linux';
var IS_I386 = process.arch === 'ia32';
var IS_X64 = process.arch === 'x64';
var IS_DEB = fs.existsSync('/etc/lsb-release') || fs.existsSync('/etc/debian_version');
var IS_RPM = fs.existsSync('/etc/redhat-release');
var linuxpackage = null;
// linux package detection
if (IS_DEB && IS_X64) {
linuxpackage = 'electron-installer-debian:linux64';
} else if (IS_DEB && IS_I386) {
linuxpackage = 'electron-installer-debian:linux32';
LINUX_FILENAME = OSX_OUT + '/' + BASENAME + '_' + packagejson.version + '_i386.deb';
} else if (IS_RPM && IS_X64) {
linuxpackage = 'electron-installer-redhat:linux64';
LINUX_FILENAME = OSX_OUT + '/' + BASENAME + '_' + packagejson.version + '_x86_64.rpm';
} else if (IS_RPM && IS_I386) {
linuxpackage = 'electron-installer-redhat:linux32';
LINUX_FILENAME = OSX_OUT + '/' + BASENAME + '_' + packagejson.version + '_x86.rpm';
}
grunt.initConfig({
IDENTITY: 'Developer ID Application: Docker Inc',
OSX_FILENAME: OSX_FILENAME,
OSX_FILENAME_ESCAPED: OSX_FILENAME.replace(/ /g, '\\ ').replace(/\(/g, '\\(').replace(/\)/g, '\\)'),
LINUX_FILENAME: LINUX_FILENAME,
// electron
electron: {
windows: {
options: {
name: BASENAME,
dir: 'build/',
out: 'dist',
version: packagejson['electron-version'],
platform: 'win32',
arch: 'x64',
asar: true,
icon: 'util/kitematic.ico'
}
},
osx: {
options: {
name: OSX_APPNAME,
dir: 'build/',
out: 'dist',
version: packagejson['electron-version'],
platform: 'darwin',
arch: 'x64',
asar: true,
'app-version': packagejson.version
}
},
linux: {
options: {
name: LINUX_APPNAME,
dir: 'build/',
out: 'dist',
version: packagejson['electron-version'],
platform: 'linux',
arch: 'x64',
asar: true,
'app-bundle-id': 'com.kitematic.kitematic',
'app-version': packagejson.version
}
}
},
rcedit: {
exes: {
files: [{
expand: true,
cwd: 'dist/' + BASENAME + '-win32-x64',
src: [BASENAME + '.exe']
}],
options: {
icon: 'util/kitematic.ico',
'file-version': packagejson.version,
'product-version': packagejson.version,
'version-string': {
'CompanyName': 'Docker',
'ProductVersion': packagejson.version,
'ProductName': WINDOWS_APPNAME,
'FileDescription': WINDOWS_APPNAME,
'InternalName': BASENAME + '.exe',
'OriginalFilename': BASENAME + '.exe',
'LegalCopyright': 'Copyright 2015-2016 Docker Inc. All rights reserved.'
}
}
}
},
// images
copy: {
dev: {
files: [{
expand: true,
cwd: '.',
src: ['package.json', 'settings.json', 'index.html'],
dest: 'build/'
}, {
expand: true,
cwd: 'images/',
src: ['**/*'],
dest: 'build/'
}, {
expand: true,
cwd: 'fonts/',
src: ['**/*'],
dest: 'build/'
}, {
cwd: 'node_modules/',
src: Object.keys(packagejson.dependencies).map(function (dep) {
return dep + '/**/*';
}),
dest: 'build/node_modules/',
expand: true
}]
},
windows: {
files: [{
expand: true,
cwd: 'resources',
src: ['ssh.exe', 'OPENSSH_LICENSE', 'msys-*'],
dest: 'dist/' + BASENAME + '-win32-x64/resources/resources'
}],
options: {
mode: true
}
},
osx: {
files: [{
expand: true,
cwd: 'resources',
src: ['terminal'],
dest: '<%= OSX_FILENAME %>/Contents/Resources/resources/'
}, {
src: 'util/kitematic.icns',
dest: '<%= OSX_FILENAME %>/Contents/Resources/atom.icns'
}],
options: {
mode: true
}
}
},
rename: {
installer: {
src: 'dist/Setup.exe',
dest: 'dist/' + BASENAME + 'Setup-' + packagejson.version + '-Windows-Alpha.exe'
}
},
// styles
less: {
options: {
sourceMapFileInline: true
},
dist: {
files: {
'build/main.css': 'styles/main.less'
}
}
},
// javascript
babel: {
options: {
sourceMap: 'inline',
blacklist: 'regenerator',
stage: 1,
optional: ['asyncToGenerator']
},
dist: {
files: [{
expand: true,
cwd: 'src/',
src: ['**/*.js'],
dest: 'build/'
}]
}
},
shell: {
electron: {
command: electron + ' ' + 'build',
options: {
async: true,
execOptions: {
env: env
}
}
},
sign: {
options: {
failOnError: false
},
command: [
'codesign --deep -v -f -s "<%= IDENTITY %>" <%= OSX_FILENAME_ESCAPED %>/Contents/Frameworks/*',
'codesign -v -f -s "<%= IDENTITY %>" <%= OSX_FILENAME_ESCAPED %>',
'codesign -vvv --display <%= OSX_FILENAME_ESCAPED %>',
'codesign -v --verify <%= OSX_FILENAME_ESCAPED %>'
].join(' && ')
},
zip: {
command: 'ditto -c -k --sequesterRsrc --keepParent <%= OSX_FILENAME_ESCAPED %> release/' + BASENAME + '-Mac.zip'
},
linux_npm: {
command: 'cd build && npm install --production'
},
linux_zip: {
command: 'ditto -c -k --sequesterRsrc --keepParent <%= LINUX_FILENAME %> release/' + BASENAME + '-Ubuntu.zip'
}
},
clean: {
release: ['build/', 'dist/']
},
compress: {
windows: {
options: {
archive: './release/' + BASENAME + '-Windows.zip',
mode: 'zip'
},
files: [{
expand: true,
dot: true,
cwd: './dist/Kitematic-win32-x64',
src: '**/*'
}]
}
},
// livereload
watchChokidar: {
options: {
spawn: true
},
livereload: {
options: {livereload: true},
files: ['build/**/*']
},
js: {
files: ['src/**/*.js'],
tasks: ['newer:babel']
},
less: {
files: ['styles/**/*.less'],
tasks: ['less']
},
copy: {
files: ['images/*', 'index.html', 'fonts/*'],
tasks: ['newer:copy:dev']
}
},
'electron-packager': {
build: {
options: {
platform: process.platform,
arch: process.arch,
dir: './build',
out: './dist/',
name: 'Kitematic',
ignore: 'bower.json',
version: packagejson['electron-version'], // set version of electron
overwrite: true
}
},
osxlnx: {
options: {
platform: 'linux',
arch: 'x64',
dir: './build',
out: './dist/',
name: 'Kitematic',
ignore: 'bower.json',
version: packagejson['electron-version'], // set version of electron
overwrite: true
}
}
},
'electron-installer-debian': {
options: {
name: BASENAME.toLowerCase(), // spaces and brackets cause linting errors
productName: LINUX_APPNAME.toLowerCase(),
productDescription: 'Run containers through a simple, yet powerful graphical user interface.',
maintainer: 'Ben French <frenchben@docker.com>',
section: 'devel',
priority: 'optional',
icon: './util/kitematic.png',
lintianOverrides: [
'changelog-file-missing-in-native-package',
'executable-not-elf-or-script',
'extra-license-file',
'non-standard-dir-perm',
'non-standard-file-perm',
'non-standard-executable-perm',
'script-not-executable',
'shlib-with-executable-bit',
'binary-without-manpage',
'debian-changelog-file-missing',
'unusual-interpreter',
'wrong-path-for-interpreter',
'backup-file-in-package',
'package-contains-vcs-control-file',
'embedded-javascript-library',
'embedded-library',
'arch-dependent-file-in-usr-share'
],
categories: [
'Utility'
],
rename: function (dest, src) {
return LINUX_FILENAME;
}
},
linux64: {
options: {
arch: 'amd64'
},
src: './dist/Kitematic-linux-x64/',
dest: './dist/'
},
linux32: {
options: {
arch: 'i386'
},
src: './dist/Kitematic-linux-ia32/',
dest: './dist/'
}
},
'electron-installer-redhat': {
options: {
productName: LINUX_APPNAME,
productDescription: 'Run containers through a simple, yet powerful graphical user interface.',
priority: 'optional',
icon: './util/kitematic.png',
categories: [
'Utilities'
],
rename: function (dest, src) {
return LINUX_FILENAME;
}
},
linux64: {
options: {
arch: 'x86_64'
},
src: './dist/Kitematic-linux-x64/',
dest: './dist/'
},
linux32: {
options: {
arch: 'x86'
},
src: './dist/Kitematic-linux-ia32/',
dest: './dist/'
}
}
});
// Load the plugins for linux packaging
grunt.loadNpmTasks('grunt-electron-packager');
grunt.loadNpmTasks('grunt-electron-installer-debian');
grunt.loadNpmTasks('grunt-electron-installer-redhat');
grunt.registerTask('default', ['newer:babel', 'less', 'newer:copy:dev', 'shell:electron', 'watchChokidar']);
if (!IS_WINDOWS && !IS_LINUX) {
grunt.registerTask('release', ['clean:release', 'babel', 'less', 'copy:dev', 'electron', 'copy:osx', 'shell:sign', 'shell:zip', 'copy:windows', 'rcedit:exes', 'compress', 'shell:linux_npm', 'electron-packager:osxlnx', 'electron-installer-debian:linux64', 'shell:linux_zip']);
}else if (IS_LINUX) {
if (linuxpackage) {
grunt.registerTask('release', ['clean:release', 'babel', 'less', 'copy:dev', 'shell:linux_npm', 'electron-packager:build', linuxpackage]);
}else {
grunt.log.errorlns('Your Linux distribution is not yet supported - arch:' + process.arch + ' platform:' + process.platform);
}
}else {
grunt.registerTask('release', ['clean:release', 'babel', 'less', 'copy:dev', 'electron:windows', 'copy:windows', 'rcedit:exes', 'compress']);
}
process.on('SIGINT', function () {
grunt.task.run(['shell:electron:kill']);
process.exit(1);
});
};

202
LICENSE Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2014-2016 Docker, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

46
MAINTAINERS Normal file
View File

@ -0,0 +1,46 @@
# Kitematic maintainers file
#
# This file describes who runs the docker/kitematic project and how.
# This is a living document - if you see something out of date or missing, speak up!
#
# It is structured to be consumable by both humans and programs.
# To extract its contents programmatically, use any TOML-compliant parser.
#
# This file is compiled into the MAINTAINERS file in docker/opensource.
#
[Org]
[Org."Core maintainers"]
people = [
"elesant",
"FrenchBen",
"jeffdm",
"mchiang0610",
]
[people]
# A reference list of all people associated with the project.
# All other sections should refer to people by their canonical key
# in the people section.
# ADD YOURSELF HERE IN ALPHABETICAL ORDER
[people.elesant]
Name = "Sean Li"
Email = "mail@shang.li"
GitHub = "elesant"
[people.FrenchBen]
Name = "Ben French"
Email = "frenchben@docker.com"
GitHub = "FrenchBen"
[people.jeffdm]
Name = "Jeff Morgan"
Email = "jmorgan@docker.com"
GitHub = "jeffdm"
[people.mchiang0610]
Name = "Michael Chiang"
Email = "mchiang@docker.com"
GitHub = "mchiang0610"

29
Makefile Normal file
View File

@ -0,0 +1,29 @@
.PHONY: docs docs-shell docs-build run
# TODO: clearly need to note pre-req's - OSX and node installed? - see contributing docs
run:
npm install
npm run
# Get the IP ADDRESS
DOCKER_IP=$(shell python -c "import urlparse ; print urlparse.urlparse('$(DOCKER_HOST)').hostname or ''")
HUGO_BASE_URL=$(shell test -z "$(DOCKER_IP)" && echo localhost || echo "$(DOCKER_IP)")
HUGO_BIND_IP=0.0.0.0
# import the existing docs build cmds from docker/docker
DOCS_MOUNT := $(if $(DOCSDIR),-v $(CURDIR)/$(DOCSDIR):/$(DOCSDIR))
DOCSPORT := 8000
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
DOCKER_DOCS_IMAGE := kitematic-docs$(if $(GIT_BRANCH),:$(GIT_BRANCH))
DOCKER_RUN_DOCS := docker run --rm -it $(DOCS_MOUNT)
docs: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 "$(DOCKER_DOCS_IMAGE)" \
hugo server \
--port=$(DOCSPORT) --baseUrl=$(HUGO_BASE_URL) --bind=$(HUGO_BIND_IP)
docs-shell: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 "$(DOCKER_DOCS_IMAGE)" bash
docs-build:
docker build -t "$(DOCKER_DOCS_IMAGE)" -f docs/Dockerfile .

60
README.md Normal file
View File

@ -0,0 +1,60 @@
[![Build Status](https://travis-ci.org/docker/kitematic.svg?branch=master)](https://travis-ci.org/docker/kitematic)
[![Kitematic Logo](https://cloud.githubusercontent.com/assets/251292/5269258/1b229c3c-7a2f-11e4-96f1-e7baf3c86d73.png)](https://kitematic.com)
Kitematic is a simple application for managing Docker containers on Mac, Linux and Windows.
![Kitematic Screenshot](https://cloud.githubusercontent.com/assets/251292/8246120/d3ab271a-15ed-11e5-8736-9a730a27c79a.png)
## Installing Kitematic
[Download the latest version](https://docker.com/toolbox) of Kitematic via the Docker Toolbox.
## Documentation
Kitematic's documentation and other information can be found at [http://kitematic.com/docs](http://kitematic.com/docs).
## Security Disclosure
Security is very important to us. If you have any issue regarding security, please disclose the information responsibly by sending an email to security@docker.com and not by creating a github issue.
## Bugs and Feature Requests
Have a bug or a feature request? Please first read the [Issue Guidelines](https://github.com/kitematic/kitematic/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/kitematic/kitematic/issues/new).
## Roadmap & Contributing
We welcome all pull requests and contributions that anyone would like to make. The Kitematic team is super happy to support anyone who wants to get involved. Please checkout our [roadmap](ROADMAP.md) that we keep up to date for ideas to help you with contributing. We would love to talk to you about contributing.
Please read through our [Contributing Guidelines](https://github.com/kitematic/kitematic/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
## Community
- [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kitematic/kitematic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
- Ask questions on our [user forum](https://forums.docker.com/c/open-source-projects/kitematic).
- **#kitematic** on IRC. [Join the channel](http://webchat.freenode.net/?channels=%23kitematic&uio=d4).
- Follow [@kitematic on Twitter](https://twitter.com/kitematic).
## Uninstalling
**Mac**
- Remove Kitematic.app
- Remove any unwanted Virtual Machines in VirtualBox
```bash
# remove app data
rm -rf ~/Library/Application\ Support/Kitematic
```
**Windows**
Open `Programs and Features` from `Control Panel`
- Uninstall Kitematic
- Uninstall Oracle VM VirtualBox
## Copyright and License
Code released under the [Apache license](LICENSE).
Images are copyrighted by Docker, Inc.

46
ROADMAP.md Normal file
View File

@ -0,0 +1,46 @@
## Kitematic Roadmap
**January 2015**
* Automatic updates
* Stability bug fixes
**Februay 2015**
* Docker machine support
* Front-end refactor
* Starting Unit tests
**March 2015**
* Kitematic re-design (container centric workflow)
* Docker Hub pull / search for public Docker images
**April 2015**
* Custom URL protocol
**May 2015**
* Docker Hub - sign-up/sign-in
* Allow users to sign-up / sign-in to Docker Hub from Kitematic.
* Docker Hub - private repo view if user is logged-in to Docker Hub account
**June 2015**
* Microsoft Windows alpha
**July 2015**
* Refactor to Flux Architecture
* Stability & code quality improvements
**August 2015**
* Make Kitematic part of the Docker Toolbox
* Stability & code quality improvements
**September 2015**
* Better integration with new version of Docker Hub
* Stability & code quality improvements

View File

@ -0,0 +1,32 @@
jest.autoMockOff();
jasmine.getEnv().defaultTimeoutInterval = 60000;
let hubUtil = require('../src/utils/HubUtil');
let Promise = require('bluebird');
describe('HubUtil Integration Tests', () => {
describe('auth', () => {
pit('successfully authenticates', () => {
return new Promise((resolve) => {
hubUtil.auth(process.env.INTEGRATION_USER, process.env.INTEGRATION_PASSWORD, (error, response, body) => {
expect(response.statusCode).toBe(200);
expect(error).toBe(null);
let data = JSON.parse(body);
expect(data.token).toBeTruthy();
resolve();
});
});
});
pit('provides a 401 if credentials are incorrect', () => {
return new Promise((resolve) => {
hubUtil.auth(process.env.INTEGRATION_USER, 'incorrectpassword', (error, response) => {
expect(response.statusCode).toBe(401);
resolve();
});
});
});
});
});

View File

@ -0,0 +1,62 @@
jest.autoMockOff();
jasmine.getEnv().defaultTimeoutInterval = 60000;
let _ = require('underscore');
let regHubUtil = require('../src/utils/RegHubUtil');
let hubUtil = require('../src/utils/HubUtil');
let Promise = require('bluebird');
describe('RegHubUtil Integration Tests', () => {
describe('with login', () => {
pit('lists private repos', () => {
return new Promise((resolve) => {
hubUtil.login(process.env.INTEGRATION_USER, process.env.INTEGRATION_PASSWORD, () => {
regHubUtil.repos((error, repos) => {
expect(_.findWhere(repos, {name: 'test_private', is_private: true})).toBeTruthy();
resolve();
});
});
});
});
pit('lists tags for a private repo', () => {
return new Promise((resolve) => {
hubUtil.login(process.env.INTEGRATION_USER, process.env.INTEGRATION_PASSWORD, () => {
regHubUtil.tags(`${process.env.INTEGRATION_USER}/test_private`, (error, tags) => {
expect(error).toBeFalsy();
expect(tags.length).toEqual(1);
expect(tags[0].name).toEqual('latest');
resolve();
});
});
});
});
});
describe('public repos', () => {
pit('lists repos', () => {
return new Promise((resolve) => {
hubUtil.login(process.env.INTEGRATION_USER, process.env.INTEGRATION_PASSWORD, () => {
regHubUtil.repos((error, repos) => {
expect(_.findWhere(repos, {name: 'test'})).toBeTruthy();
resolve();
});
});
});
});
pit('lists tags for a repo', () => {
return new Promise((resolve) => {
hubUtil.login(process.env.INTEGRATION_USER, process.env.INTEGRATION_PASSWORD, () => {
regHubUtil.tags(`${process.env.INTEGRATION_USER}/test`, (error, tags) => {
expect(error).toBeFalsy();
expect(tags.length).toEqual(1);
expect(tags[0].name).toEqual('latest');
resolve();
});
});
});
});
});
});

5
__mocks__/app.js Normal file
View File

@ -0,0 +1,5 @@
module.exports = {
require: jest.genMockFunction(),
match: jest.genMockFunction(),
on: jest.genMockFunction()
};

7
__mocks__/electron.js Normal file
View File

@ -0,0 +1,7 @@
module.exports = {
require: jest.genMockFunction(),
match: jest.genMockFunction(),
app: jest.genMockFunction(),
remote: jest.genMockFunction(),
dialog: jest.genMockFunction()
};

4
__mocks__/remote.js Normal file
View File

@ -0,0 +1,4 @@
module.exports = {
require: jest.genMockFunction(),
match: jest.genMockFunction()
};

67
__tests__/Util-test.js Normal file
View File

@ -0,0 +1,67 @@
jest.dontMock('../src/utils/Util').dontMock('console');
const util = require('../src/utils/Util');
describe('Util', () => {
describe('when removing sensitive data', () => {
it('filters ssh certificate data', () => {
var testdata = String.raw`time="2015-04-17T21:43:47-04:00" level="debug" msg="executing: ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectionAttempts=30 -o LogLevel=quiet -p 50483 -i /Users/johnappleseed/.docker/machine/machines/dev2/id_rsa docker@localhost sudo mkdir -p /var/lib/boot2docker" time="2015-04-17T21:43:47-04:00" level="debug" msg="executing: ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectionAttempts=30 -o LogLevel=quiet -p 50483 -i /Users/johnappleseed/.docker/machine/machines/dev2/id_rsa docker@localhost echo \"-----BEGIN CERTIFICATE-----\nMIIC+DCCAeKgAwIBAgIRANfIbsa2M94gDY+fBiBiQBkwCwYJKoZIhvcNAQELMBIx\nEDAOBgNVBAoTB2ptb3JnYW4wHhcNMTUwNDE4MDEzODAwWhcNMTgwNDAyMDEzODAw\nWjAPMQ0wCwYDVQQKEwRkZXYyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEA1yamWT0bk0pRU7eiStjiXe2jkzdeI0SdJZo+bjczkl6kzNW/FmR/OkcP8gHX\nCO3fUCWkR/+rBgz3nuM1Sy0BIUo0EMQGfx17OqIJPXO+BrpCHsXlphHmbQl5bE2Y\nF+bAsGc6WCippw/caNnIHRsb6zAZVYX2AHLYY0fwIDAQABo1AwTjAOBgNVHQ8BAf8EBAMCAKAwHQYD\nVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMAwGA1UdEwEB/wQCMAAwDwYDVR0R\nBAgwBocEwKhjZTALBgkqhkiG9w0BAQsDggEBAKBdD86+kl4X1VMjgGlNYnc42tWa\nbo1iDl/frxiLkfPSc2McAOm3AqX1ao+ynjqq1XTlBLPTQByu/oNZgA724LRJDfdG\nCKGUV8latW7rB1yhf/SZSmyhNjufuWlgCtbkw7Q/oPddzYuSOdDW8tVok9gMC0vL\naqKCWfVKkCmvGH+8/wPrkYmro/f0uwJ8ee+yrbBPlBE/qE+Lqcfr0YcXEDaS8CmL\nDjWg7KNFpA6M+/tFNQhplbjwRsCt7C4bzQu0aBIG5XH1Jr2HrKlLjWdmluPHWUL6\nX5Vh1bslYJzsSdBNZFWSKShZ+gtRpjtV7NynANDJPQNIRhDxAf4uDY9hA2c=\n-----END CERTIFICATE-----\n\" | sudo tee /var/lib/boot2docker/server.pem"
time="2015-04-17T21:43:47-04:00" level="debug" msg="executing: /usr/bin/VBoxManage showvminfo dev2 --machinereadable"`;
expect(util.removeSensitiveData(testdata).indexOf('CERTIFICATE')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('nX5Vh1bslYJzsSdBNZFWSKShZ+gtRpjtV7NynANDJPQNIRhDxAf4uDY9hA2c')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('<redacted>')).toNotEqual(-1);
});
it('filters ssh private key data', () => {
var testdata = String.raw`hZbuxglOtQv2AQqOp/luhZ3Y8kDs4cqRzoA1o+k+LAyjEb+Nk\nGA8=\n-----END CERTIFICATE-----\n\" | sudo tee /var/lib/boot2docker/ca.pem"
time="2015-04-17T21:43:47-04:00" level="debug" msg="executing: ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectionAttempts=30 -o LogLevel=quiet -p 50483 -i /Users/johnappleseed/.docker/machine/machines/dev2/id_rsa docker@localhost echo \"-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA1yamWT0bk0pRU7eiStjiXe2jkzdeI0SdJZo+bjczkl6kzNW/\nFmR/OkcP8gHXCO3fUCWkR/+rBgz3nuM1Sy0BIUo0EMQGfx17OqIJPXO+BrpCHsXl\nphHmbQl5bE2YF+bAsGc6WCippczQIu5bPweeAkR1WdlkhD08tHD4o1ESe09fXx5G\nXcZFfd2xQWdvAJX3fTuGBk3IMEF2fye5b69zUyVDGbTylyjKDOi9Xxdlc4y9cOPw\nzcwQFCOJiCBYlxDO0fbinA+KigCs29Dd5U3oXbloLr3JQTE/SkxFh9W5rkX8ysY4\n2h3EnR7YIBWt/caNnIHRsb6zAZVYX2AHLYY0fwIDAQABAoIBAQDKF3TTh/G59WnU\n4D2iXnyqy8gFRVG4gP+3TV3s+w8HIr1b5j6akwVqwUs5//5zVbSYPPNF6eJESbPi\nW/s4ROq10VR8lxSfHBsfJQrW3TwWZ6gp7atbxZ6Stv6F+5CsisReLmiAXJmVsn+j\nAA9Xchk6egFcxzWCfV7jAuaZyVI53cclepm/xkGjPwrfXr+nA+UMvO6DllC6IcBF\no4+O0jVtzdMecZnQk6nWxNJjurodTTQakrNAqSMgBshn48wf3N35b+p8RtTzLJ8L\nYuHkv6OKMITIazcHadjsN8icGgIGf2BJ1CRje7j0Yzow8jwY+Pet3yxKSfXED89B\nD34AEXl5AoGBANi17og+yPFOWURUrksO/QyzlOtXcQdQu8SmkUj4ACoqF0gegQIb\nC/DNMcYxJAsPPgw/t5Ws/af8DuatYguGukmekYREVjc7DS/hPWDZzeavPd95cOw0\nuMPgJE76HJ3BSYcp1f8WKcN+xDket9CF6Qz+VX5aQSUEc333V5h7D/nzAoGBAP4o\nVCvQu5eKYmDhMFSOA0+Qm3EECRqMLoH6kpEcbMjM8+kOeI0fUuE3CX8nzs7P4py/\n0IFj2Yxl578NHJOjCpbB1UKtxLkmDH42wXXzrWJXRaWXC93dh1sl0aB6qE25FtSD\nzjYh4y1DA/t6y95YRrIqC2WhIU7eigIoujmtOFJFAoGABSKiiWX7ewRhRyY+jxbG\n1lM3FzCWRBccq/dKgBEoZ9dhf9sBMZyUdttV751gfkaZMM8duZVE2YM2ky7OoPlL\nVs1EI38/D8X9dQIAY1gl8e57J92H2IETU8ju81Qn83EOHf7WzFmpGbHaUoQw1Ocn\nc6BfREQ9QPRPDFAdKkbYRRMCgYEAl44k4xvNQUhb8blWwJUOlFt+1Z26cAI3mXp5\n+94fYH4W1Fq0uDJ9kZ7oItLyF5EPaLlY9E8+YuJBl0OSTtdicROUv/Yu4Nk3ievM\n4TE1qvavqVaw1NRM6qVao3+A7Rf57S/Lv6vldBAKR+OpviSVw5gew7OZ0RYS5caz\nhcEtXKECgYAJb7t67nococm0PsRe8Xv1SQOQjetrhzwzD1PLOSC9TrzwA22/ZktZ\neu/qfvYgOPT4LkDGVCzn8J+TAcUVnIvAnJRQTsBu55uiL8YC5jZQ8E1hBf7kskMq\nh16WD19Djv3WhfBNXBxvnagDDWw5DxmiiKzSf0k3QDDoX7wjDAV1dQ==\n-----END RSA PRIVATE KEY-----\n\" | sudo tee /var/lib/boot2docker/server-key.pem"
time="2015-04-17T21:43:47-04:00" level="debug" msg="executing: ssh -o IdentitiesOnly=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectionAttempts=30 -o LogLevel=quiet -p 50483 -i /Users/johnappleseed/.docker/machine/machines/dev2/id_rsa docker@localhost echo \"-----BEGIN CERTIFICATE-----\nMIIC+DCCAeKgAwIBAgIRANfIbsa2M94gDY+fBiBiQBkwCwYJKoZIhvcNAQELMBIx\nEDAOBg`;
expect(util.removeSensitiveData(testdata).indexOf('PRIVATE')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('94fYH4W1Fq0uDJ9kZ7oItLyF5EPaLlY9E8+YuJBl0OSTtdicROUv')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('<redacted>')).toNotEqual(-1);
});
it('filters username data', () => {
var testdata = String.raw`/Users/johnappleseed/.docker/machine/machines/dev2/id_rsa docker@localhost echo`;
expect(util.removeSensitiveData(testdata).indexOf('/Users/johnappleseed/')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('/Users/<redacted>/')).toNotEqual(-1);
testdata = String.raw`/Users/some.wei-rdUsername/.docker/machine/machines/dev2/id_rsa docker@localhost echo`;
expect(util.removeSensitiveData(testdata).indexOf('/Users/some.wei-rdUsername/.docker')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('/Users/<redacted>/.docker')).toNotEqual(-1);
});
it('filters Windows username data', () => {
var testdata = String.raw`C:\\Users\\johnappleseed\\.docker\\machine`;
expect(util.removeSensitiveData(testdata).indexOf('johnappleseed')).toEqual(-1);
expect(util.removeSensitiveData(testdata).indexOf('<redacted>')).toNotEqual(-1);
});
it ('returns input if empty or not a string', () => {
expect(util.removeSensitiveData('')).toBe('');
expect(util.removeSensitiveData(1)).toBe(1);
expect(util.removeSensitiveData(undefined)).toBe(undefined);
});
});
describe('when verifying that a repo is official', () => {
it('accepts official repo', () => {
expect(util.isOfficialRepo('redis')).toBe(true);
});
it('rejects falsy value as official repo', () => {
expect(util.isOfficialRepo(undefined)).toBe(false);
});
it('rejects empty repo name', () => {
expect(util.isOfficialRepo('')).toBe(false);
});
it('rejects repo with non official namespace', () => {
expect(util.isOfficialRepo('kitematic/html')).toBe(false);
});
it('rejects repo with a different registry address', () => {
expect(util.isOfficialRepo('www.myregistry.com/kitematic/html')).toBe(false);
});
});
});

16
circle.yml Normal file
View File

@ -0,0 +1,16 @@
machine:
xcode:
version: "7.0"
dependencies:
cache_directories:
- "node_modules"
deployment:
release:
tag: /v.*/
owner: docker
commands:
- github-release upload --user docker --repo kitematic --tag $CIRCLE_TAG --file release/Kitematic-Mac.zip --name Kitematic-$(echo $CIRCLE_TAG | cut -c2-)-Mac.zip
- github-release upload --user docker --repo kitematic --tag $CIRCLE_TAG --file release/Kitematic-Windows.zip --name Kitematic-$(echo $CIRCLE_TAG | cut -c2-)-Windows.zip
- github-release upload --user docker --repo kitematic --tag $CIRCLE_TAG --file release/Kitematic-Ubuntu.zip --name Kitematic-$(echo $CIRCLE_TAG | cut -c2-)-Ubuntu.zip

8
docs/Dockerfile Normal file
View File

@ -0,0 +1,8 @@
FROM docs/base:oss
MAINTAINER Docker Docs <docs@docker.com>
ENV PROJECT=kitematic
# To get the git info for this repo
COPY . /src
RUN rm -rf /docs/content/$PROJECT/
COPY . /docs/content/$PROJECT/

38
docs/Makefile Normal file
View File

@ -0,0 +1,38 @@
.PHONY: all default docs docs-build docs-shell shell test
# to allow `make DOCSDIR=docs docs-shell` (to create a bind mount in docs)
DOCS_MOUNT := $(if $(DOCSDIR),-v $(CURDIR)/$(DOCSDIR):/$(DOCSDIR))
# to allow `make DOCSPORT=9000 docs`
DOCSPORT := 8000
# Get the IP ADDRESS
DOCKER_IP=$(shell python -c "import urlparse ; print urlparse.urlparse('$(DOCKER_HOST)').hostname or ''")
HUGO_BASE_URL=$(shell test -z "$(DOCKER_IP)" && echo localhost || echo "$(DOCKER_IP)")
HUGO_BIND_IP=0.0.0.0
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
GIT_BRANCH_CLEAN := $(shell echo $(GIT_BRANCH) | sed -e "s/[^[:alnum:]]/-/g")
DOCKER_DOCS_IMAGE := docker-docs$(if $(GIT_BRANCH_CLEAN),:$(GIT_BRANCH_CLEAN))
DOCKER_RUN_DOCS := docker run --rm -it $(DOCS_MOUNT) -e AWS_S3_BUCKET -e NOCACHE
# for some docs workarounds (see below in "docs-build" target)
GITCOMMIT := $(shell git rev-parse --short HEAD 2>/dev/null)
default: docs
docs: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 -e DOCKERHOST "$(DOCKER_DOCS_IMAGE)" hugo server --port=$(DOCSPORT) --baseUrl=$(HUGO_BASE_URL) --bind=$(HUGO_BIND_IP)
docs-draft: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 -e DOCKERHOST "$(DOCKER_DOCS_IMAGE)" hugo server --buildDrafts="true" --port=$(DOCSPORT) --baseUrl=$(HUGO_BASE_URL) --bind=$(HUGO_BIND_IP)
docs-shell: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 "$(DOCKER_DOCS_IMAGE)" bash
test: docs-build
$(DOCKER_RUN_DOCS) -p $(if $(DOCSPORT),$(DOCSPORT):)8000 "$(DOCKER_DOCS_IMAGE)"
docs-build:
docker build -t "$(DOCKER_DOCS_IMAGE)" .

70
docs/faq.md Executable file
View File

@ -0,0 +1,70 @@
<!--[metadata]>
+++
title = "Frequently Asked Questions"
description = "Documentation covering common questions users have about Kitematic"
keywords = ["docker, documentation, about, technology, kitematic, gui"]
[menu.main]
parent="toolbox_kitematic"
weight=5
+++
<![end-metadata]-->
# Kitematic: Frequently Asked Questions
### Is Kitematic Open Source?
Yes! Our source code is available on
[GitHub](https://github.com/kitematic/kitematic). Kitematic is open source
software released under the Apache 2.0 license.
### How can I contribute to Kitematic?
We always welcome (and deeply appreciate!) new contributions to the project. The
best way to start contributing to Kitematic is to review our doc on <a href="https://github.com/kitematic/kitematic/blob/master/CONTRIBUTING.md">contributing</a>.
### How does Kitematic work with Docker?
Kitematic connects directly to a running instance of Docker and controls it via
the Docker Remote API.
### Which platforms does Kitematic support?
Right now Kitematic works on Mac OS X and Windows. Linux is planned in the
future. Review our product <a
href="https://github.com/kitematic/kitematic/blob/master/ROADMAP.md">roadmap</a>.
### Why does Kitematic collect usage analytics and bug reports?
Kitematic tracks anonymous errors and analytics to help understand why things go
wrong and to help understand how users are interacting with the app so we can
continuously make it better.
You can opt-out of this anytime via the in-app preferences.
#### What we DON'T collect
- Personal information: any information that would allow us to determine a
specific user of Kitematic
- Information or data relating to code, containers or Docker images opened via
Kitematic.
#### What we DO collect
- Anonymous events for actions in the app. We never collect data associated with
events. For example:
- User searched for images (but not what the search query was).
- User created a container (but not which image, the name of the container or
any data involved)
- User opened the preferences pane
- User deleted a container
- Errors names, messages & stack traces (scrubbed for user names)
- Operating System, Kitematic and installed VirtualBox versions
We'd love to answer any more questions about this. Feel free to reach us at
kitematic@docker.com or to open an issue on GitHub.
## Next Steps
For information about known issues in the current release of Kitematic, take a
look at the [Known issues](./known-issues.md).

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
docs/images/containers.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

BIN
docs/images/installing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
docs/images/nginx-2048.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

BIN
docs/images/volumes-dir.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

17
docs/index.md Executable file
View File

@ -0,0 +1,17 @@
<!--[metadata]>
+++
title = "Kitematic"
description = "Documentation that provides an overview of Kitematic and installation instructions"
keywords = ["docker, documentation, about, technology, kitematic, gui"]
[menu.main]
identifier="toolbox_kitematic"
parent="workw_toolbox"
weight=2
+++
<![end-metadata]-->
# Kitematic
Kitematic, the Docker GUI, runs on Mac OS X and Windows operating systems. Beginning with the 1.8 Docker release, you use the Docker Toolbox to install Kitematic. See the [Mac OS X installation guide](https://docs.docker.com/installation/mac) or the [Windows installation guide](https://docs.docker.com/installation/windows) for details on installing with Docker Toolbox.
For information about using Kitematic, take a look at the [User Guide](userguide.md).

50
docs/known-issues.md Executable file
View File

@ -0,0 +1,50 @@
<!--[metadata]>
+++
title = "Known Issues"
description = "Information about known issues in Kitematic"
keywords = ["docker, documentation, about, technology, kitematic, gui"]
[menu.main]
parent="toolbox_kitematic"
weight=5
+++
<![end-metadata]-->
# Kitematic: Known Issues
Kitematic is in beta, so we're still working out the kinks. The most common
errors occur at the setup stage since creating a VM reliably with VirtualBox can
be tricky. We are working on this problem.
In the meantime, below are a list of common errors and solutions that work for
most people.
## Setup Error or Hanging at 99%
Sometimes Kitematic doesn't set up VirtualBox properly. Retrying the setup
usually works (via one of the two retry buttons). If not, try the following
commands on the command line:
- `docker-machine rm -f dev`
- `docker-machine create -d virtualbox dev`
Then re-open Kitematic. This usually fixes the issue, but if it persists, feel
free to view our <a href="https://github.com/kitematic/kitematic/issues?q=is%3Aopen+is%3Aissue+label%3Abug">existing GitHub
issues</a>.
## Contributing Fixes
We're always looking for help to make Kitematic better and more reliable! Visit
[our GitHub page](https://github.com/kitematic/kitematic) for docs on how to
contribute.
Under the hood, Kitematic uses [Docker
Machine](https://github.com/docker/machine) to provision Docker-enabled VMs via
VirtualBox. We're still working on a stronger integration with this project.
Their [GitHub repo](https://github.com/docker/machine) is a great place to start
if you're looking to help fix specific issues around VM provisioning.
## View All Issues
For a full list of Kitematic bugs or issues see our <a href="https://github.com/kitematic/kitematic/issues?q=is%3Aopen+is%3Aissue+label%3Abug">existing GitHub
issues</a> labelled as `bug`.

78
docs/minecraft-server.md Executable file
View File

@ -0,0 +1,78 @@
<!--[metadata]>
+++
title = "Set up a Minecraft Server"
description = "Tutorial demonstrating the setup of a Minecraft server using Docker and Kitematic"
keywords = ["docker, documentation, about, technology, kitematic, gui, minecraft, tutorial"]
[menu.main]
parent="toolbox_kitematic"
weight=2
+++
<![end-metadata]-->
# Kitematic tutorial: Set up a Minecraft server
This is a quick tutorial demonstrating how to set up a local Minecraft server
using Kitematic and Docker.
### Create Minecraft Server Container
First, if you haven't yet done so, [download and start
Kitematic](index.md). Once installed and running, the app should look like this:
Create a container from the recommended Minecraft image by clicking the "Create"
button.
![create Minecraft container](images/minecraft-create.png)
After the image finishes downloading, you'll see the home screen for the
Minecraft container. Your Minecraft server is now up and running inside a Docker
container. Note that we've marked the IP and port you can use to connect to
your Minecraft server in red (your IP and port may be different from what's
shown).
![Minecraft server port and IP info](images/minecraft-port.png)
### Connect to Minecraft server
Open your Minecraft client, log in with your Minecraft account and click on the
"Multiplayer" button.
![Minecraft login screen](images/minecraft-login.png)
Click the "Add Server" button to add the Minecraft server you want to connect
to.
![Add server](images/minecraft-login.png)
Fill in the "Server Address" text box with the marked IP and port from Kitematic
you saw earlier.
![Minecraft server address](images/minecraft-server-address.png)
Click on the play button to connect to your Minecraft server and enjoy!
### Change map using Docker volume
Open the "data" folder from Kitematic (You'll need to "Enable all volumes to edit
files via Finder"). We use Docker Volume to map the folder from the Minecraft
Docker container onto your computer.
![Minecraft data volume](images/minecraft-data-volume.png)
The Finder will open, allowing you to replace your current map with the new one
you desire.
![Minecraft maps](images/minecraft-map.png)
Restart your container by clicking the "Restart" button.
![Restart Minecraft container](images/minecraft-restart.png)
Go back to your Minecraft client and join your server. The new map should load.
## Next Steps
For an example using Kitematic to run Nginx, take a look at the [Nginx web
server](./nginx-web-server.md) page.

87
docs/nginx-web-server.md Executable file
View File

@ -0,0 +1,87 @@
<!--[metadata]>
+++
title = "Set up an Nginx web server"
description = "Tutorial demonstrating the setup of an Nginx web server using Docker and Kitematic"
keywords = ["docker, documentation, about, technology, kitematic, gui, nginx, tutorial"]
[menu.main]
parent="toolbox_kitematic"
weight=1
+++
<![end-metadata]-->
# Kitematic Tutorial: Serving a Static Website with Nginx
In this tutorial, you will:
- Download and run a web server container
- Explore the container's website data natively on your Mac
- Use volumes to modify the website data
In this example website we'll be serving the popular 2048 game, as shown below.
Let's get to it!
![2048 game](images/nginx-2048.png)
#### Running the Nginx Web Server Container
First, if you haven't yet done so, [download and start
Kitematic](index.md). Once installed and running, the app should look like this:
![Nginx create](images/nginx-create.png)
Click on the _Create_ button of the `hello-world-nginx` listing as shown above.
Kitematic will download (also known as pull the image) and then run a tiny Nginx web server
in a Docker container, allowing it to serve website data to your Mac.
![download Nginx hello world](images/nginx-hello-world.png)
Once it's done downloading you should see a quick preview of the example website
that comes with the container, as shown below. Click on the preview to see the
result in your own browser.
![Nginx preview](images/nginx-preview.png)
**What just happened?** Kitematic downloaded the `kitematic/hello-world-nginx`
image from the Docker Hub and then created and ran a Docker Nginx container from
this image.
#### Viewing the Website Data in Finder
This container exposes website data via a _Docker volume_. Kitematic makes
managing Docker volumes easy - you can edit the data in Finder or with your
favorite text editor. By default, Kitematic places volumes under `~/Kitematic`
but you can change this in the container settings. To access the files via
finder, click on the in-app folder icon for a container and "Enable all volumes
to edit via Finder":
![Nginx data volume](images/nginx-data-volume.png)
A Finder window of the folder should open containing the index.html file we see
being served by the container.
![Nginx data folder](images/nginx-data-folder.png)
#### Serving Your Own Website Data
Now let's try serving a more interesting website. [Download the zipped
files](https://github.com/gabrielecirulli/2048/archive/master.zip) for 2048, a
popular (and addictive) web-based tile game. Extract this zip file into the
folder you just opened:
![Website files for 2048](images/nginx-2048-files.png)
Switch back to Kitematic and restart the container by clicking the "Restart"
button as shown below. Your Nginx container should now be serving 2048.
![Nginx running 2048](images/nginx-serving-2048.png)
**What just happened?**
Kitematic can map Docker container volumes to directories on your
Mac. In this case you changed the container's volume data via the Finder to
serve a website we downloaded.
## Next Steps
For an example using Kitematic to run a Local RethinkDB database, take a look at
the [RethinkDB development Database](./rethinkdb-dev-database.md) example.

61
docs/pre-process.sh Executable file
View File

@ -0,0 +1,61 @@
#!/bin/bash -e
# Populate an array with just docker dirs and one with content dirs
docker_dir=(`ls -d /docs/content/docker/*`)
content_dir=(`ls -d /docs/content/*`)
# Loop content not of docker/
#
# Sed to process GitHub Markdown
# 1-2 Remove comment code from metadata block
# 3 Remove .md extension from link text
# 4 Change ](/ to ](/project/ in links
# 5 Change ](word) to ](/project/word)
# 6 Change ](../../ to ](/project/
# 7 Change ](../ to ](/project/word)
#
for i in "${content_dir[@]}"
do
:
case $i in
"/docs/content/windows")
;;
"/docs/content/mac")
;;
"/docs/content/linux")
;;
"/docs/content/docker")
y=${i##*/}
find $i -type f -name "*.md" -exec sed -i.old \
-e '/^<!.*metadata]>/g' \
-e '/^<!.*end-metadata.*>/g' {} \;
;;
*)
y=${i##*/}
find $i -type f -name "*.md" -exec sed -i.old \
-e '/^<!.*metadata]>/g' \
-e '/^<!.*end-metadata.*>/g' \
-e 's/\(\]\)\([(]\)\(\/\)/\1\2\/'$y'\//g' \
-e 's/\(\][(]\)\([A-z].*\)\(\.md\)/\1\/'$y'\/\2/g' \
-e 's/\([(]\)\(.*\)\(\.md\)/\1\2/g' \
-e 's/\(\][(]\)\(\.\/\)/\1\/'$y'\//g' \
-e 's/\(\][(]\)\(\.\.\/\.\.\/\)/\1\/'$y'\//g' \
-e 's/\(\][(]\)\(\.\.\/\)/\1\/'$y'\//g' {} \;
;;
esac
done
#
# Move docker directories to content
#
for i in "${docker_dir[@]}"
do
:
if [ -d $i ]
then
mv $i /docs/content/
fi
done
rm -rf /docs/content/docker

69
docs/rethinkdb-dev-database.md Executable file
View File

@ -0,0 +1,69 @@
<!--[metadata]>
+++
title = "Creating a Local RethinkDB Database for Development"
description = "Tutorial demonstrating the setup of an RethinkDB database for development"
keywords = ["docker, documentation, about, technology, kitematic, gui, rethink, tutorial"]
[menu.main]
parent="toolbox_kitematic"
weight=3
+++
<![end-metadata]-->
# Kitematic Tutorial: Creating a Local RethinkDB Database for Development
In this tutorial, you will:
- Create a RethinkDB Container for Development
- (Advanced) Clone a small Node.js application and write data into RethinkDB.
### Setting up RethinkDB in Kitematic
First, if you haven't yet done so, [download and start
Kitematic](index.md). Once open, the app should look like
this:
![Rethink create button](images/rethink-create.png)
Click on the _Create_ button of the `rethinkdb` image listing in the recommended
list as shown above. This will download & run a RethinkDB container within a few
minutes. Once it's done, you'll have a local RethinkDB database up and running.
![Rethink container](images/rethink-container.png)
Let's start using it to develop a node.js app. For now, let's figure out which
IP address and port RethinkDB is listening on. To find out, click the `Settings`
tab and then the `Ports` section:
![Rethink create button](images/rethink-ports.png)
You can see there that for RethinkDB port `28015`, the container is listening on
host `192.168.99.100` and port `49154` (in this example - ports may be different
for you). This means you can now reach RethinkDB via a client driver at
`192.168.99.100:49154`. Again, this IP address may be different for you.
### (Advanced) Saving Data into RethinkDB with a local Node.js App
Now, you'll create the RethinkDB example chat application running on your local
OS X system to test drive your new containerized database.
First, if you don't have it yet, [download and install
Node.js](http://nodejs.org/).
> **Note**: this example needs Xcode installed. We'll replace it with something
> with fewer dependencies soon.
In your terminal, type:
$ export RDB_HOST=192.168.99.100 # replace with IP from above step
$ export RDB_PORT=49154 # replace with Port from above step
$ git clone https://github.com/rethinkdb/rethinkdb-example-nodejs-chat
$ cd rethinkdb-example-nodejs-chat
$ npm install
$ npm start
Now, point your browser to `http://localhost:8000`. Congratulations, you've
successfully used a RethinkDB container in Kitematic to build a real-time chat
app. Happy coding!
![Rethink app preview](images/rethinkdb-preview.png)

199
docs/userguide.md Executable file
View File

@ -0,0 +1,199 @@
<!--[metadata]>
+++
title = "Kitematic User Guide: Intro & Overview"
description = "Documentation that provides an overview of Kitematic and installation instructions"
keywords = ["docker, documentation, about, technology, kitematic, gui"]
[menu.main]
parent="toolbox_kitematic"
+++
<![end-metadata]-->
# Kitematic user guide
## Overview
Kitematic is an open source project built to simplify and streamline using
Docker on a Mac or Windows (coming soon) PC. Kitematic automates the Docker
installation and setup process and provides an intuitive graphical user
interface (GUI) for running Docker containers. Kitematic integrates with
[Docker Machine](https://docs.docker.com/machine/) to provision a VirtualBox VM
and install the Docker Engine locally on your machine.
Once installed, the Kitematic GUI launches and from the home screen you will be
presented with curated images that you can run instantly. You can search for any
public images on Docker Hub from Kitematic just by typing in the search bar.
You can use the GUI to create, run and manage your containers just by clicking
on buttons. Kitematic allows you to switch back and forth between the Docker CLI
and the GUI. Kitematic also automates advanced features such as managing ports
and configuring volumes. You can use Kitematic to change environment variables,
stream logs, and single click terminal into your Docker container all from the
GUI.
First, if you haven't yet done so, [download and start
Kitematic](index.md).
## Container list
Kitematic lists all running and stopped containers on the left side, underneath
the "New Container" link.
The container list includes all containers, even those not started by Kitematic,
giving you a quick over-view of the state of your Docker daemon.
You can click on any container to view its logs (the output of the main container
process), restart, stop or exec `sh` in that container. See [Working with a
container](#working-with-a-container) for more details.
## Creating a new container
The "New Container" page lets you search for and select from images on the Docker Hub.
When you've found the image you want to run, you can click "Create" to pull, create,
and run the container.
![Nginx create](images/browse-images.png)
## Working with a container
If you select a non-running container, either stopped, or paused, you will be able
to "Restart" or "Stop" the container using the icons. You can also view the entire
main container process' output logs, and in the Settings section you can make
changes which will be used if you "Restart" this container.
By selecting a running container from the left list, you can see some state information
for your container - either a preview of the HTML output for a container that has a web
server, the main container process' logs, and any container volumes that have been
configured.
![Redis container in Kitematic](images/cli-redis-container.png)
The summary page will show different things depending on the image metadata. If
a known "web" port (see below) is `EXPOSED`, then Kitematic assumes its a web page,
and will show a preview of the site at `/`. If other ports are exposed, then it
will show a list of those ports, and the Docker daemon IP and port they are mapped
to. If there are any `VOLUMES`, then these will be shown. At minimum, the summary
screen will show the main container process' log output.
The currently detected "web" ports are, `80`, `8000`, `8080`, `3000`, `5000`,
`2368`, `9200`, and `8983`.
### Viewing container logs
You can view the entire main container process' log output either by clicking on the "Logs"
preview image, or by clicking on the "Logs" tab.
You can then scroll through the logs from the current running container. Note that
if you make changes to the container settings, then the container will be restarted,
so this will reset this log view.
### Starting a terminal in a container
The "Terminal" icon at the top of the container summary will `docker exec sh <your container>`.
This will allow you to make quick changes, or to debug a problem.
> **Note**: Your exec'ed `sh` process will not have the same environment settings
> as the main container process and its children.
### Managing Volumes
You can choose to make all of a container's volumes mapped to directories on
on your Mac by clicking on the folders in the "Edit Files" section of the
container summary screen.
This allows you to manage files in volumes via the Finder.
Kitematic exposes a container's volume data under `~/Documents/Kitematic/<container's name>/`.
Quick access to this folder (or directory) is available via the app:
![Accessing the volumes directory](images/volumes-dir.png)
> **Note**: When you "Enable all volumes to edit files in Finder", the Docker
> container will be stopped, removed and re-created with the new `volumes`
> flag.
#### Changing Volume Directories
Let's say you have an Nginx webserver running via Kitematic (using the
`kitematic/hello-world-nginx` image on DockerHub). However, you don't want to
use the default directory created for the website_files volume. Instead, you
already have the HTML, Javascript, and CSS for your website under
`~/workspace/website`.
Navigate to the "Settings" tab of the container, and go to the "Volumes". This
screen allows you to set the mappings individually.
![screen shot 2015-02-28 at 2 48 01 pm](images/change-folder.png)
> **Note**: When you "Change Folders", the Docker
> container will be stopped, removed and re-created with the new `volumes`
> flag.
### Setting the container name
By default, Kitematic sets the container name to the same as the image name (or
with a `-<number>` if there are more than one.
To simplify administration, or when using container linking or volumes, you may
want to rename it.
> **Note**: When you rename the container it will be stopped, removed and
> re-created with the new name (due to the default volumes mapping).
### Adding Environment variables
Many images use environment variables to let you customise them. The "General"
"Settings" tab allows you to add and modify the environment variables used to
start a container.
The list of environment variables will show any that have been set on the image
metadata - for example, using the `ENV` instruction in the Dockerfile.
<TODO: image of the jenkins container>
When you "Save" the changed environment variables, the container will be stopped,
removed and re-created.
### Delete container
On the "General" "Settings" tab, you can delete the container. Clicking "Delete
Container" will also stop the container if necessary.
You can also delete a container by clicking the `X` icon in the container list.
Kitematic will prompt you to confirm that you want to delete.
#### List the exposed Ports and how to access them
To see the complete list of exposed ports, go to "Settings" then "Ports". This
page lists all the container ports exposed, and the IP address and host-only
network port that you can access use to access that container from your OS X
system.
## Docker Command-line Access
You can interact with existing containers in Kitematic or create new containers
via the Docker Command Line Interface (CLI). Any changes you make on the CLI are
directly reflected in Kitematic.
To open a terminal via Kitematic, just press the whale button at the bottom left, as
shown below:
![CLI access button](images/cli-access-button.png)
### Example: Creating a new Redis container
Start by opening a Docker-CLI ready terminal by clicking the whale button as
described above. Once the terminal opens, enter `docker run -d -P redis`. This
will pull and run a new Redis container via the Docker CLI.
![Docker CLI terminal window](images/cli-terminal.png)
> **Note**: If you're creating containers from the command line, use `docker run -d`
> so that Kitematic can re-create the container when settings are changed via the
> Kitematic user interface. Containers started without `-d` will fail to re-start.
Now, go back to Kitematic. The Redis container should now be visible.
![Redis container in Kitematic](images/cli-redis-container.png)
## Next Steps
For an example using Kitematic to run a Minecraft server, take a look at
the [Minecraft server](./minecraft-server.md) page.

BIN
fonts/kitematic.eot Normal file

Binary file not shown.

32
fonts/kitematic.svg Normal file
View File

@ -0,0 +1,32 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by Fontastic.me</metadata>
<defs>
<font id="kitematic" horiz-adv-x="512">
<font-face font-family="kitematic" units-per-em="512" ascent="480" descent="-32"/>
<missing-glyph horiz-adv-x="512" />
<glyph glyph-name="add" unicode="&#97;" d="M256 0c-7 0-12 5-12 12l0 488c0 7 5 12 12 12 7 0 12-5 12-12l0-488c0-7-5-12-12-12z m244 256l-488 0c-7 0-12 5-12 12 0 8 5 12 12 12l488 0c7 0 12-4 12-12 0-7-5-12-12-12z"/>
<glyph glyph-name="badge-private" unicode="&#101;" d="M411 0l-310 0c-19 0-36 15-36 36l0 238c0 20 16 36 36 36l310 0c19 0 36-16 36-36l0-238c0-21-16-36-36-36z m-310 286c-6 0-12-6-12-12l0-238c0-7 5-12 12-12l310 0c6 0 12 6 12 12l0 238c0 7-5 12-12 12z m286 12l-24 0 0 76c0 55-43 114-107 114-64 0-107-59-107-114l0-76-24 0 0 76c0 75 60 138 131 138 71 0 131-63 131-138z m-131-227c-20 0-36 16-36 36l0 36c-14 11-24 28-24 48 0 33 27 59 60 59 33 0 60-26 60-59 0-20-10-37-24-48l0-36c0-20-16-36-36-36z m0 155c-20 0-36-15-36-35 0-14 7-25 18-31l6-4 0-49c0-7 5-12 12-12 7 0 12 5 12 12l0 49 6 4c11 6 18 17 18 31 0 20-16 35-36 35z"/>
<glyph glyph-name="restart" unicode="&#102;" d="M156 226c-1 0-1 0 0 0-5 0-7 3-10 5l-36 48c-4 4-4 13 2 16 5 4 13 4 17-2l28-37 37 38c5 5 12 5 17 0 5-5 5-12 0-17l-47-47c-2-3-6-4-8-4z m104-71c-6 0-12 5-12 12 0 7 4 12 12 12 25 1 47 10 64 28 14 16 22 37 21 59-2 46-43 82-91 79-25-1-49-12-65-29-16-18-23-43-21-70 0-7-5-11-11-13-7 0-12 5-13 11-2 33 7 63 27 87 21 23 50 37 81 38 62 2 115-44 117-103 1-28-8-55-28-75-21-22-49-35-81-36 1 0 1 0 0 0z m-4-155c-142 0-256 114-256 256 0 142 114 256 256 256 142 0 256-114 256-256 0-142-114-256-256-256z m0 488c-129 0-232-103-232-232 0-129 103-232 232-232 129 0 232 103 232 232 0 129-103 232-232 232z"/>
<glyph glyph-name="browser-view" unicode="&#103;" d="M256 0c-142 0-256 114-256 256 0 142 114 256 256 256 142 0 256-114 256-256 0-142-114-256-256-256z m0 488c-129 0-232-103-232-232 0-129 103-232 232-232 129 0 232 103 232 232 0 129-103 232-232 232z m137-292l-19 0-14 48-14-48-19 0-20 65-20-65-19 0-14 48-13-48-20 0-20 65-20-65-19 0-14 48-13-48-20 0-27 86 23 0 14-49 13 49 19 0 14-49 15 49 31 0 14-49 13 49 19 0 14-49 15 49 31 0 14-49 13 49 19 0 14-49 15 49 22 0z"/>
<glyph glyph-name="search" unicode="&#104;" d="M500 0c-3 0-5 1-8 3l-198 198c-4 5-4 12 0 17 5 4 12 4 17 0l198-198c4-5 4-12 0-17-3-2-5-3-9-3z m-320 151c-99 0-180 82-180 181 0 99 81 180 180 180 99 0 181-81 181-180 0-99-82-181-181-181z m0 338c-86 0-157-71-157-157 0-86 71-157 157-157 86 0 157 71 157 157 0 86-71 157-157 157z"/>
<glyph glyph-name="start" unicode="&#105;" d="M256 0c-142 0-256 114-256 256 0 142 114 256 256 256 142 0 256-114 256-256 0-142-114-256-256-256z m0 488c-129 0-232-103-232-232 0-129 103-232 232-232 129 0 232 103 232 232 0 129-103 232-232 232z m-52-337c-15 0-25 11-25 28l0 142c0 16 9 28 25 28 4 0 9-1 14-4l148-74c9-4 15-13 15-21 0-8-6-17-15-21l-148-74c-6-3-11-4-14-4z m0 174c0 0-2-1-2-4l0-142c0-3 0-4 2-4 0 0 1 0 3 1l148 74-148 74c-2 1-3 1-3 1z"/>
<glyph glyph-name="delete" unicode="&#106;" d="M27 18c-4 0-8 1-11 4-6 6-6 14 0 21l445 444c6 7 15 7 21 0 6-6 6-14 0-20l-445-445c-2-2-6-4-10-4z m457-2c-4 0-7 1-10 4l-445 445c-6 6-6 14 0 20 6 7 14 7 20 0l445-444c6-7 6-15 0-21-2-2-6-4-10-4z"/>
<glyph glyph-name="stop" unicode="&#108;" d="M321 155l-130 0c-21 0-36 15-36 36l0 130c0 21 15 36 36 36l130 0c21 0 36-15 36-36l0-130c0-21-15-36-36-36z m-130 178c-8 0-12-4-12-12l0-130c0-8 4-12 12-12l130 0c8 0 12 4 12 12l0 130c0 8-4 12-12 12z m65-333c-142 0-256 114-256 256 0 142 114 256 256 256 142 0 256-114 256-256 0-142-114-256-256-256z m0 488c-129 0-232-103-232-232 0-129 103-232 232-232 129 0 232 103 232 232 0 129-103 232-232 232z"/>
<glyph glyph-name="tag" unicode="&#109;" d="M315 9c-4 0-7 1-9 3l-302 306c-3 3-4 5-4 9l0 173c0 7 5 12 12 12l173 0c4 0 6-1 9-4l306-302c2-2 5-7 3-12-1-4-3-7-8-9l-129-39-39-129c-2-4-5-7-9-8-1 0-2 0-3 0z m-291 323l284-288 36 116c1 3 3 7 8 8l116 36-288 284-156 0z m95 7c-29 0-53 24-53 54 0 29 24 53 53 53 30 0 54-24 54-53 0-30-24-54-54-54z m0 83c-15 0-29-14-29-29 0-16 14-30 29-30 16 0 30 14 30 30 0 15-14 29-30 29z"/>
<glyph glyph-name="expand" unicode="&#113;" d="M300 287c-4 0-7 1-9 4-5 5-5 12 0 17l200 200c5 5 12 5 17 0 5-5 5-12 0-17l-200-200c-2-3-5-4-8-4z m-275-275c-4 0-6 2-9 4-5 5-5 13 0 18l200 200c5 5 13 5 18 0 5-5 5-13 0-18l-200-200c-3-2-5-4-9-4z m475 338c-8 0-13 5-13 12l0 125-125 0c-7 0-12 5-12 13 0 7 5 12 12 12l138 0c7 0 12-5 12-12l0-138c0-7-5-12-12-12z m-350-350l-138 0c-7 0-12 5-12 12l0 138c0 7 5 12 12 12 8 0 13-5 13-12l0-125 125 0c7 0 12-5 12-13 0-7-5-12-12-12z"/>
<glyph glyph-name="favorite" unicode="&#114;" d="M256 23c-2 0-5 1-7 3-10 7-249 181-249 317 0 91 67 146 133 146 43 0 95-26 123-93 28 67 80 93 123 93 66 0 133-55 133-146 0-135-239-309-249-317-2-2-5-3-7-3z m-123 442c-54 0-110-45-110-122 0-111 193-264 233-293 40 29 233 182 233 293 0 77-56 122-110 122-53 0-95-40-111-110-2-5-6-9-12-9-6 0-10 3-12 9-16 70-58 110-111 110z"/>
<glyph glyph-name="feedback" unicode="&#115;" d="M29 6c-4 0-6 1-9 4-3 3-5 9-2 14l55 107c-47 42-73 98-73 154 0 122 114 222 256 222 142 0 256-100 256-222 0-123-114-223-256-223-32 0-61 7-83 14l-140-69c-1-1-3-1-4-1z m227 476c-129 0-232-89-232-199 0-51 26-103 71-141 5-4 6-10 3-15l-43-83 111 55c2 1 5 1 9 1 21-7 50-14 81-14 129 0 232 89 232 199 0 108-103 197-232 197z m-115-119l219 0 0-24-219 0z m0-59l219 0 0-24-219 0z m0-60l219 0 0-24-219 0z"/>
<glyph glyph-name="link" unicode="&#116;" d="M162 214c-13 0-24 5-33 15l-109 108c-13 13-20 30-20 48 0 17 7 34 20 47l61 61c13 13 30 20 48 20 17 0 34-7 47-20l109-108c10-11 15-25 13-41-3-14-10-28-23-40-5-5-12-5-17 0-4 4-4 12 0 16 10 10 15 19 16 28 1 8-1 14-7 20l-109 108c-16 17-45 17-62 0l-60-60c-9-9-13-19-13-31 0-12 4-23 13-31l108-109c6-6 12-8 20-7 9 1 19 7 28 16 4 4 12 4 16 0 5-5 5-12 0-17-13-13-27-20-41-23 0 0-3 0-5 0z m221-214c-17 0-34 7-47 20l-107 109c-22 21-18 54 9 81 5 4 12 4 17 0 5-5 5-12 0-17-14-14-24-33-10-48l107-108c9-8 19-13 31-13 12 0 23 5 31 13l62 62c9 8 13 19 13 31 0 12-4 22-13 31l-108 107c-14 14-35 5-48-10-4-4-12-4-16 0-5 5-5 12 0 17 27 27 59 31 81 10l108-108c13-13 20-29 20-47 0-18-7-35-19-48l-62-62c-14-13-31-20-49-20z m-26 143c-3 0-6 1-8 3l-191 191c-4 5-4 12 0 17 5 4 12 4 17 0l191-191c4-5 4-12 0-17-3-2-5-3-9-3z"/>
<glyph glyph-name="more" unicode="&#117;" d="M70 186c-39 0-70 32-70 70 0 38 31 70 70 70 38 0 70-32 70-70 0-38-32-70-70-70z m0 117c-26 0-47-21-47-47 0-26 21-47 47-47 25 0 46 21 46 47 0 26-21 47-46 47z m186-117c-38 0-70 32-70 70 0 38 32 70 70 70 38 0 70-32 70-70 0-38-32-70-70-70z m0 117c-26 0-47-21-47-47 0-26 21-47 47-47 26 0 47 21 47 47 0 26-21 47-47 47z m186-117c-38 0-70 32-70 70 0 38 32 70 70 70 39 0 70-32 70-70 0-38-31-70-70-70z m0 117c-25 0-46-21-46-47 0-26 21-47 46-47 26 0 47 21 47 47 0 26-21 47-47 47z"/>
<glyph glyph-name="preferences" unicode="&#118;" d="M297 0l-84 0c-7 0-12 5-12 12l0 61c-2 1-5 3-8 3-9 3-20 7-30 11l-42-43c-5-5-13-5-17 0l-60 60c-3 2-4 4-4 8 0 4 1 6 4 9l43 42c-8 15-14 34-18 54l-58 0c-7 0-12 5-12 12l0 67c0 8 5 12 12 12l60 0c3 11 9 26 16 38l-43 43c-5 5-5 12 0 17l60 60c4 5 12 5 17 0l42-43c13 6 27 12 38 16l0 61c0 7 5 12 12 12l84 0c8 0 13-5 13-12l0-60c11-4 25-8 37-16l43 43c5 5 12 5 17 0l60-60c2-2 4-5 4-8 0-4-2-6-4-9l-43-43c6-12 11-24 16-37l60 0c7 0 12-5 12-13l0-67c0-7-5-12-12-12l-59 0c-3-29-9-42-17-55l42-41c5-5 5-12 0-17l-60-60c-5-5-12-5-17 0l-43 43c-10-5-19-9-29-11-2-1-6-3-9-3l0-61c2-8-3-13-11-13z m-70 24l59 0 0 56c0 5 3 9 7 11 3 3 9 5 18 8 11 3 24 8 33 13 5 3 11 3 14-1l41-40 42 42-40 41c-4 3-5 9-1 14l1 1c9 15 15 25 18 63 2 6 6 11 13 11l56 0 0 42-56 0c-7 0-11 4-13 10-3 17-11 34-19 49-3 5-3 11 1 14l40 41-42 42-41-40c-3-4-9-5-14-1-15 8-40 18-48 19-6 2-10 6-10 13l0 56-59 0 0-56c0-7-4-11-10-13-10-2-34-11-48-19-4-3-11-3-14 1l-40 40-43-42 40-41c4-3 5-9 1-14-8-15-17-39-19-49-1-5-6-10-12-10l-56 0 0-42 56 0c6 0 11-5 12-11 4-25 11-50 19-64 3-5 3-11-1-14l-40-41 43-42 40 40c3 4 10 5 14 1 9-5 22-10 33-13 8-3 15-5 19-8 3-2 6-6 6-11z m29 122c-61 0-110 49-110 110 0 61 49 110 110 110 61 0 110-49 110-110 0-61-49-110-110-110z m0 195c-48 0-85-37-85-85 0-48 37-85 85-85 48 0 85 37 85 85 0 48-37 85-85 85z"/>
<glyph glyph-name="badge-official" unicode="&#99;" d="M252 512c8 0 14 0 21 0 0 0 1 0 1 0 9 0 19-2 28-4 33-7 61-22 85-47 25-28 38-60 37-97-1-19-6-38-16-54-15-30-39-52-69-66-4-2-10-5-15-7 33-76 68-152 101-229-1 0-1 0-2 2-55 30-110 63-165 94-1 1-2 1-3 0-55-31-111-64-166-94 0 0-1-2-1-2 0 0 0 0 0 2 0 1 1 1 1 2 34 74 67 149 99 223 1 2 3 4 4 8-1 0-1 0-1 1-24 11-43 25-60 45-23 29-32 62-27 98 2 24 11 45 26 63 30 38 69 57 116 62 2-1 4 0 6 0z m16-24c-24 0-42-2-58-9-28-11-52-28-67-53-17-26-22-53-14-83 6-25 20-45 39-61 24-19 51-30 82-32 23-2 44 1 64 8 28 10 52 27 67 52 18 27 23 58 13 90-8 25-24 45-45 61-25 18-55 26-81 27z m105-424c-24 55-49 111-73 166-29-6-57-5-86 2-25-56-50-112-75-168 2 0 2 0 2 0 38 22 75 43 113 65 1 1 2 1 3 0 26-16 53-30 79-46 13-4 25-12 37-19z m-113 222c-29 0-52 8-72 25-14 13-24 28-26 47-2 19 1 37 12 53 13 20 31 32 53 38 30 8 59 5 86-12 18-11 30-26 36-46 7-27 2-49-14-70-15-17-35-28-58-33-7-2-14-2-17-2z m-4 24c2 0 4 0 6 0 1 0 2 0 4 0 17 2 34 8 46 21 14 14 19 32 13 51-5 16-14 26-27 34-19 11-41 14-63 9-16-3-30-12-40-25-9-12-13-26-10-40 2-15 9-25 20-34 15-12 33-16 51-16z"/>
<glyph glyph-name="docker-cli" unicode="&#100;" d="M0 274c0 5 0 11 0 16 0 0 0 0 0 2 0 4 1 8 1 13 0 3 1 7 1 12 17 0 34 0 50 0 0 28 0 55 0 83 28 0 56 0 84 0 0 1 0 1 0 2 0 26 0 54 0 80 0 1 0 1 0 2 34 0 70 0 104 0 0 0 0 0 0-1 0-27 0-55 0-82 0 0 0-1 0-1 29 0 56 0 84 0 0-28 0-55 0-83 16-1 31 1 46 7-1 3-2 6-3 9-4 13-5 25-3 39 1 9 3 18 7 26 3 6 7 12 11 17 3 3 5 5 8 8 5-4 9-8 14-12 12-10 21-21 28-35 2-4 3-7 4-11 0 0 0 0 1 0 5 0 11 1 16 1 11 0 21-2 31-8 7-3 13-8 20-11-2-5-6-11-8-16-6-11-13-21-25-28-14-9-30-13-47-14-1 0-2 0-2-1-5-11-10-23-17-33 0 0 0-1-1-2 1 0 1 0 2 0 21 0 43 0 64 0 17 0 32-14 32-31 0-60 0-120 0-179 0-14-10-26-23-30-3-2-5-2-7-2-81 0-164 0-245 0 0 0 0 0-1 0-17 3-29 15-29 32 0 27 0 54 0 82 0 1 0 1 0 2-8 0-15-1-23-1-18 0-38 1-57 7-31 7-57 23-79 46-10 9-17 21-23 32-10 19-15 38-16 59 2 0 1 2 1 4z m350-44c-40 0-79 0-119 0-6 0-12-4-12-12 0-58 0-117 0-175 0-7 5-12 12-12 79 0 159 0 238 0 7 0 12 6 12 12 0 58 0 117 0 175 0 8-5 12-12 12-40 0-79 0-119 0z m50 86c-3-3-6-5-8-6-16-9-33-14-51-15-10-1-19 0-29 0-96 0-192 0-288 0-1 0-1 0-2 0 0-1 0-1 0-1-1-12 0-23 1-34 2-14 6-29 14-42 9-16 22-31 37-42 24-18 52-27 82-28 10-1 21 0 30 0 4 0 8 0 11 1 0 1 0 1 0 3 0 22 0 45 0 70 0 17 14 31 32 31 49 0 99 0 148 0 1 0 2 0 3 1 11 17 19 33 26 52 2 1 2 4 3 4 1 1 3 0 5 0 8-1 16 0 25 1 12 2 23 8 31 17 2 3 5 6 6 10 0 0-1 0-1 1-7 4-14 5-23 6-9 0-17-1-27-4-2-1-5-2-8-2-1 10-2 20-7 31-6 9-12 18-20 25-1-3-3-5-4-7-4-7-5-14-5-21 0-8 0-14 2-20 5-15 11-23 17-31z m-264 0c0 20 0 41 0 62-21 0-42 0-63 0 0-21 0-42 0-62 21 0 42 0 63 0z m21 0c21 0 42 0 62 0 0 20 0 41 0 62-20 0-41 0-62 0 0-21 0-42 0-62z m62 146c-20 0-41 0-62 0 0-21 0-42 0-63 21 0 42 0 62 0 0 21 0 42 0 63z m84-84c-21 0-42 0-63 0 0-21 0-42 0-62 21 0 42 0 63 0 0 20 0 41 0 62z m7-247c-5 6-10 12-15 18-3 5-7 8-10 12-4 4-3 11 1 15 4 4 12 3 15-2 10-12 21-25 31-36 2-2 3-4 6-6-4-5-7-8-10-12-9-10-18-21-27-31-4-5-12-5-16 0-3 4-4 9 0 13 8 9 15 17 22 27 1-2 2 0 3 2z m71-48c-8 0-16 0-26 0-4 0-7 2-9 6-2 4-1 7 1 10 2 3 5 4 8 4 18 0 35 0 53 0 6 0 10-4 10-10 0-6-4-10-10-10-9 0-17 0-27 0z m-235 142c0-20-15-37-34-38-21-1-38 15-39 36-1 20 16 36 35 37 21 2 37-13 38-35z m-36-16c8 0 15 7 15 16 0 8-7 15-15 15-9 0-16-7-16-15 0-10 7-16 16-16z"/>
<glyph glyph-name="docker-exec" unicode="&#107;" d="M256 0c-141 0-256 115-256 256 0 141 115 256 256 256 141 0 256-115 256-256 0-141-115-256-256-256z m0 488c-128 0-232-104-232-232 0-128 104-232 232-232 128 0 232 104 232 232 0 128-104 232-232 232z m98-306l-110 0c-8 0-12 5-12 12 0 7 4 12 12 12l110 0c7 0 12-5 12-12 0-7-5-12-12-12z m-220 1c-2 0-6 1-8 4-5 4-5 12-2 17l54 58-54 59c-5 4-3 12 2 17 4 5 12 3 17-2l68-75-68-76c-3-1-5-2-9-2z"/>
<glyph glyph-name="user" unicode="&#110;" d="M245 512c7 0 15 0 23 0 0 0 1 0 1 0 11-1 20-1 31-4 36-6 69-19 100-40 37-25 66-57 85-97 15-32 25-65 27-101 1-22 0-45-5-68-7-32-20-63-38-90-25-36-57-64-96-85-32-16-66-25-102-27-23-1-47 0-71 6-51 12-95 37-131 76-25 28-43 57-55 93-7 20-10 42-12 63 0 3 0 5-1 7 0 7 0 15 0 23 0 0 0 1 0 1 1 13 3 26 5 39 11 49 33 92 69 128 21 21 45 38 71 51 31 14 64 23 98 25 0-1 1 0 1 0z m-62-319c-19 19-28 42-28 69 0 27 11 50 30 68 34 33 88 34 126 5 19-16 30-36 33-60 5-30-3-56-23-79 49-29 73-72 72-129 67 46 113 140 88 243-25 103-121 181-235 176-108-5-198-84-219-191-9-52-2-103 24-151 17-31 39-57 68-79-1 56 20 98 64 128z m48-4c-6-2-12-6-18-8-18-7-32-18-44-33-21-27-28-58-24-91 1-6 1-6 7-9 43-22 90-29 137-23 27 4 53 12 77 25 1 0 1 1 2 2 5 22 3 42-4 62-10 29-29 50-57 65-8 3-16 6-24 9-2 1-4 1-7 3 3 1 4 2 6 3 7 6 16 11 22 17 15 16 21 35 19 57-3 17-10 32-22 44-16 15-35 21-57 19-17-2-32-10-44-21-15-17-23-37-19-61 4-22 14-38 33-50 5-1 11-6 17-10z"/>
<glyph glyph-name="open-external" unicode="&#98;" d="M4 436c1 0 1 0 3 0 78 0 157 0 236 0 1 0 1 0 2 0 0-9 0-17 0-26-72 0-143 0-215 0 0-126 0-254 0-380 126 0 254 0 380 0 0 67 0 135 0 202 9 0 17 0 26 0 0-1 0-1 0-2 0-75 0-150 0-225 0-1 0-1 0-2-145 0-289 0-432 0 0 144 0 288 0 433z m508-116c0-1 0-2-1-4-3-5-8-9-15-7-6 1-10 6-10 13 0 47 0 95 0 143 0 1 0 1 0 2-2-1-2-1-3-1-80-80-161-161-241-242-7-6-18-5-21 3-3 5-2 11 2 15 0 0 1 1 1 1 81 80 161 160 241 240 0 0 1 1 1 1-1 0-1 0-3 0-47 0-94 0-141 0-7 0-12 3-13 10-3 6 1 14 7 17 0 0 2 0 2 1 60 0 122 0 182 0 4-1 7-3 9-7 2-1 2-4 2-5 1-60 1-121 1-180z m0 179c0 1-1 4-1 5-2 4-6 5-10 7 4 0 8 0 11 0 0-3 0-7 0-12z"/>
<glyph glyph-name="edit" unicode="&#111;" d="M11 436c1 0 1 0 2 0 78 0 155 0 232 0 2 0 2 0 3 0 0-9 0-17 0-26-71 0-142 0-211 0 0-125 0-250 0-375 124 0 249 0 374 0 0 71 0 142 0 212 9 0 17 0 26 0 0-2 0-2 0-3 0-79 0-156 0-235 0 0 0-1 0-1-142 0-285 0-426 0 0 144 0 286 0 428z m501 0c-1-4-4-7-7-9-53-54-107-108-162-162-2-1-4-4-7-4-31-12-64-25-96-37-5-2-10-1-14 3-4 4-5 9-3 15 12 31 25 64 37 95 1 3 3 6 4 7 54 54 108 108 163 163 2 2 5 5 9 6 1 0 2 0 4 0 4-1 6-4 9-6 18-19 37-37 55-55 3-3 5-6 7-10 1-4 1-5 1-6z m-177-142c35 36 71 71 106 106-13 14-27 28-41 41-35-35-70-71-106-106 13-15 28-28 41-41z m126 125c6 6 13 13 19 19-13 14-27 28-40 41-7-6-13-13-20-20 13-13 26-27 41-40z m-150-141c-10 11-21 21-33 33-6-17-13-34-19-52 18 6 35 13 52 19z"/>
<glyph glyph-name="download" unicode="&#112;" d="M256 512c-39 0-70-32-70-71l0-236 20 9-59 59c-23 23-60 23-83 0-23-24-23-61 0-84l184-186c4-4 12-4 16 0l184 186c23 23 23 60 0 84-23 23-60 23-83 0l-59-59 20-9 0 236c0 39-31 71-70 71z m0-23c26 0 47-21 47-48l0-236c0-10 12-15 20-8l58 59c14 14 37 14 51 0 14-14 14-37 0-51l-184-185 16 0-184 185c-14 14-14 37 0 51 14 14 37 14 51 0l58-59c8-7 20-2 20 8l0 236c0 27 21 48 47 48z"/>
</font></defs></svg>

After

Width:  |  Height:  |  Size: 14 KiB

BIN
fonts/kitematic.ttf Normal file

Binary file not shown.

BIN
fonts/kitematic.woff Normal file

Binary file not shown.

BIN
images/boot2docker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
images/boot2docker@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
images/button-restart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
images/button-start.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
images/button-start@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
images/button-stop.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
images/button-stop@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
images/button-terminal.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
images/button-view.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
images/button-view@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
images/cartoon-docker.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
images/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

BIN
images/close@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

BIN
images/connect-art.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
images/connect-art@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

BIN
images/connect-to-hub.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
images/container-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 B

BIN
images/container.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 B

BIN
images/container@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

BIN
images/downloading.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

BIN
images/downloading@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
images/error.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 B

BIN
images/error@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Some files were not shown because too many files have changed in this diff Show More