From efc625fcd00b0f76e484d0bc081bafcfd789cfbb Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sat, 7 Mar 2015 14:06:40 +0100 Subject: [PATCH] Cleanup: new project docs fix-ups (alternative) This cleans up the recently added project docs and fixes some minor issues. - remove inline styles where possible - add redirects for renamed/replaced documents - add styles for GitHub labels to match the style on GitHub - fix minor markdown issues causing some code-blocks to be shown as text - wrap the documents to 80-chars - use 4 spaces in stead of tabs for identing and remove trailing whitespace/redundant blank lines - optimized 'gordon' image NOTE: This alternative commit/PR re-introduces some inline styles because the docs/base image has not yet been updated for the current docs. Signed-off-by: Sebastiaan van Stijn --- docs/s3_website.json | 5 +- docs/sources/project/advanced-contributing.md | 133 ++-- docs/sources/project/coding-style.md | 57 +- docs/sources/project/doc-style.md | 4 +- docs/sources/project/get-help.md | 162 +++-- docs/sources/project/images/gordon.jpeg | Bin 25387 -> 19941 bytes docs/sources/project/make-a-contribution.md | 601 ++++++++++-------- docs/sources/project/set-up-dev-env.md | 574 ++++++++--------- docs/sources/project/set-up-prereqs.md | 310 ++++----- docs/sources/project/test-and-docs.md | 279 ++++---- docs/sources/project/who-written-for.md | 38 +- 11 files changed, 1204 insertions(+), 959 deletions(-) diff --git a/docs/s3_website.json b/docs/s3_website.json index 7e32d99734..490c492ea4 100644 --- a/docs/s3_website.json +++ b/docs/s3_website.json @@ -36,7 +36,10 @@ { "Condition": { "KeyPrefixEquals": "examples/using_supervisord/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "articles/using_supervisord/" } }, { "Condition": { "KeyPrefixEquals": "reference/api/registry_index_spec/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "reference/api/hub_registry_spec/" } }, { "Condition": { "KeyPrefixEquals": "use/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "examples/" } }, - { "Condition": { "KeyPrefixEquals": "installation/openSUSE/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "installation/SUSE/" } } + { "Condition": { "KeyPrefixEquals": "installation/openSUSE/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "installation/SUSE/" } }, + { "Condition": { "KeyPrefixEquals": "contributing/contributing/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "project/who-written-for/" } }, + { "Condition": { "KeyPrefixEquals": "contributing/devenvironment/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "project/set-up-prereqs/" } }, + { "Condition": { "KeyPrefixEquals": "contributing/docs_style-guide/" }, "Redirect": { "HostName": "$BUCKET", "ReplaceKeyPrefixWith": "project/doc-style/" } } ] } diff --git a/docs/sources/project/advanced-contributing.md b/docs/sources/project/advanced-contributing.md index 063ca65c66..df5756d9d7 100644 --- a/docs/sources/project/advanced-contributing.md +++ b/docs/sources/project/advanced-contributing.md @@ -4,15 +4,23 @@ page_keywords: contribute, project, design, refactor, proposal # Advanced contributing -In this section, you learn about the more advanced contributions you can make. They are advanced because they have a more involved workflow or require greater programming experience. Don't be scared off though, if you like to stretch and challenge yourself, this is the place for you. +In this section, you learn about the more advanced contributions you can make. +They are advanced because they have a more involved workflow or require greater +programming experience. Don't be scared off though, if you like to stretch and +challenge yourself, this is the place for you. -This section gives generalized instructions for advanced contributions. You'll read about the workflow but there are not specific descriptions of commands. Your goal should be to understand the processes described. +This section gives generalized instructions for advanced contributions. You'll +read about the workflow but there are not specific descriptions of commands. +Your goal should be to understand the processes described. -At this point, you should have read and worked through the earlier parts of the project contributor guide. You should also have made at least one project contribution. +At this point, you should have read and worked through the earlier parts of +the project contributor guide. You should also have + made at least one project contribution. ## Refactor or cleanup proposal -A refactor or cleanup proposal changes Docker's internal structure without altering the external behavior. To make this type of proposal: +A refactor or cleanup proposal changes Docker's internal structure without +altering the external behavior. To make this type of proposal: 1. Fork `docker/docker`. @@ -24,31 +32,36 @@ A refactor or cleanup proposal changes Docker's internal structure without alter 4. Submit your code through a pull request (PR). - The PR's title should have the format: - - **Cleanup:** _short title_ - - If your changes required logic changes, note that in your request. + The PR's title should have the format: + + **Cleanup:** _short title_ + + If your changes required logic changes, note that in your request. 5. Work through Docker's review process until merge. ## Design proposal -A design proposal solves a problem or adds a feature to the Docker software. The process for submitting design proposals requires two pull requests, one for the design and one for the implementation. +A design proposal solves a problem or adds a feature to the Docker software. +The process for submitting design proposals requires two pull requests, one +for the design and one for the implementation. ![Simple process](/project/images/proposal.png) -The important thing to notice is that both the design pull request and the implementation pull request go through a review. In other words, there is considerable time commitment in a design proposal; so, you might want to pair with someone on design work. +The important thing to notice is that both the design pull request and the +implementation pull request go through a review. In other words, there is +considerable time commitment in a design proposal; so, you might want to pair +with someone on design work. The following provides greater detail on the process: 1. Come up with an idea. - Ideas usually come from limitations users feel working with a product. So, - take some time to really use Docker. Try it on different platforms; explore - how it works with different web applications. Go to some community events - and find out what other users want. + Ideas usually come from limitations users feel working with a product. So, + take some time to really use Docker. Try it on different platforms; explore + how it works with different web applications. Go to some community events + and find out what other users want. 2. Review existing issues and proposals to make sure no other user is proposing a similar idea. @@ -58,69 +71,69 @@ The following provides greater detail on the process: 3. Talk to the community about your idea. - We have lots of community forums - where you can get feedback on your idea. Float your idea in a forum or two - to get some commentary going on it. - + We have lots of community forums + where you can get feedback on your idea. Float your idea in a forum or two + to get some commentary going on it. + 4. Fork `docker/docker` and clone the repo to your local host. 5. Create a new Markdown file in the area you wish to change. - For example, if you want to redesign our daemon create a new file under the - `daemon/` folder. + For example, if you want to redesign our daemon create a new file under the + `daemon/` folder. + +6. Name the file descriptively, for example `redesign-daemon-proposal.md`. -6. Name the file descriptively, for example `redesign-daemon-proposal.md`. - 7. Write a proposal for your change into the file. - This is a markdown file that describes your idea. Your proposal - should include information like: - - * Why is this changed needed or what are the use cases? - * What are the requirements this change should meet? - * What are some ways to design/implement this feature? - * Which design/implementation do you think is best and why? - * What are the risks or limitations of your proposal? - - This is your chance to convince people your idea is sound. - + This is a Markdown file that describes your idea. Your proposal + should include information like: + + * Why is this changed needed or what are the use cases? + * What are the requirements this change should meet? + * What are some ways to design/implement this feature? + * Which design/implementation do you think is best and why? + * What are the risks or limitations of your proposal? + + This is your chance to convince people your idea is sound. + 8. Submit your proposal in a pull request to `docker/docker`. - The title should have the format: - - **Proposal:** _short title_ - - The body of the pull request should include a brief summary of your change - and then say something like "_See the file for a complete description_". - + The title should have the format: + + **Proposal:** _short title_ + + The body of the pull request should include a brief summary of your change + and then say something like "_See the file for a complete description_". + 9. Refine your proposal through review. - The maintainers and the community review your proposal. You'll need to - answer questions and sometimes explain or defend your approach. This is - chance for everyone to both teach and learn. - + The maintainers and the community review your proposal. You'll need to + answer questions and sometimes explain or defend your approach. This is + chance for everyone to both teach and learn. + 10. Pull request accepted. - Your request may also be rejected. Not every idea is a good fit for Docker. - Let's assume though your proposal succeeded. - + Your request may also be rejected. Not every idea is a good fit for Docker. + Let's assume though your proposal succeeded. + 11. Implement your idea. - Implementation uses all the standard practices of any contribution. - - * fork `docker/docker` - * create a feature branch - * sync frequently back to master - * test as you go and full test before a PR - - If you run into issues, the community is there to help. - + Implementation uses all the standard practices of any contribution. + + * fork `docker/docker` + * create a feature branch + * sync frequently back to master + * test as you go and full test before a PR + + If you run into issues, the community is there to help. + 12. When you have a complete implementation, submit a pull request back to `docker/docker`. 13. Review and iterate on your code. - If you are making a large code change, you can expect greater scrutiny - during this phase. - + If you are making a large code change, you can expect greater scrutiny + during this phase. + 14. Acceptance and merge! diff --git a/docs/sources/project/coding-style.md b/docs/sources/project/coding-style.md index 42a852a395..e5b6f5fe9c 100644 --- a/docs/sources/project/coding-style.md +++ b/docs/sources/project/coding-style.md @@ -4,22 +4,26 @@ page_keywords: change, commit, squash, request, pull request, test, unit test, i # Coding Style Checklist -This checklist summarizes the material you experienced working through [make a code contribution](/project/make-a-contribution) and [advanced contributing](/project/advanced-contributing). The checklist applies to code that is program code or code that is documentation code. +This checklist summarizes the material you experienced working through [make a +code contribution](/project/make-a-contribution) and [advanced +contributing](/project/advanced-contributing). The checklist applies to code +that is program code or code that is documentation code. ## Change and commit code * Fork the `docker/docker` repository. -* Make changes on your fork in a feature branch. Name your branch `XXXX-something` where `XXXX` is the issue number you are working on. +* Make changes on your fork in a feature branch. Name your branch `XXXX-something` + where `XXXX` is the issue number you are working on. * Run `gofmt -s -w file.go` on each changed file before -committing your changes. Most editors have plug-ins that do this automatically. + committing your changes. Most editors have plug-ins that do this automatically. * Update the documentation when creating or modifying features. * Commits that fix or close an issue should reference them in the commit message -`Closes #XXXX` or `Fixes #XXXX`. Mentions help by automatically closing the -issue on a merge. + `Closes #XXXX` or `Fixes #XXXX`. Mentions help by automatically closing the + issue on a merge. * After every commit, run the test suite and ensure it is passing. @@ -27,7 +31,8 @@ issue on a merge. * Set your `git` signature and make sure you sign each commit. -* Do not add yourself to the `AUTHORS` file. This file is autogenerated from the Git history. +* Do not add yourself to the `AUTHORS` file. This file is autogenerated from the + Git history. ## Tests and testing @@ -37,40 +42,52 @@ issue on a merge. * Use existing Docker test files (`name_test.go`) for inspiration. -* Run the full test suite on your branch before submitting a pull request. +* Run the full test suite on your + branch before submitting a pull request. * Run `make docs` to build the documentation and then check it locally. * Use an online grammar -checker or similar to test you documentation changes for clarity, concision, -and correctness. + checker or similar to test you documentation changes for clarity, + concision, and correctness. ## Pull requests * Sync and cleanly rebase on top of Docker's `master` without multiple branches -mixed into the PR. + mixed into the PR. -* Before the pull request, squash your commits into logical units of work using `git rebase -i` and `git push -f`. +* Before the pull request, squash your commits into logical units of work using + `git rebase -i` and `git push -f`. -* Include documentation changes in the same commit so that a revert would remove all traces of the feature or fix. +* Include documentation changes in the same commit so that a revert would + remove all traces of the feature or fix. * Reference each issue in your pull request description (`#XXXX`) ## Respond to pull requests reviews -* Docker maintainers use LGTM (**l**ooks-**g**ood-**t**o-**m**e) in PR comments to indicate acceptance. +* Docker maintainers use LGTM (**l**ooks-**g**ood-**t**o-**m**e) in PR comments + to indicate acceptance. -* Code review comments may be added to your pull request. Discuss, then make the -suggested modifications and push additional commits to your feature branch. +* Code review comments may be added to your pull request. Discuss, then make + the suggested modifications and push additional commits to your feature + branch. -* Incorporate changes on your feature branch and push to your fork. This automatically updates your open pull request. +* Incorporate changes on your feature branch and push to your fork. This + automatically updates your open pull request. -* Post a comment after pushing to alert reviewers to PR changes; pushing a change does not send notifications. +* Post a comment after pushing to alert reviewers to PR changes; pushing a + change does not send notifications. -* A change requires LGTMs from an absolute majority maintainers of an affected component. For example, if you change `docs/` and `registry/` code, an absolute majority of the `docs/` and the `registry/` maintainers must approve your PR. +* A change requires LGTMs from an absolute majority maintainers of an + affected component. For example, if you change `docs/` and `registry/` code, + an absolute majority of the `docs/` and the `registry/` maintainers must + approve your PR. ## Merges after pull requests -* After a merge, [a master build](https://master.dockerproject.com/) is available almost immediately. +* After a merge, [a master build](https://master.dockerproject.com/) is + available almost immediately. -* If you made a documentation change, you can see it at [docs.master.dockerproject.com](http://docs.master.dockerproject.com/). +* If you made a documentation change, you can see it at + [docs.master.dockerproject.com](http://docs.master.dockerproject.com/). diff --git a/docs/sources/project/doc-style.md b/docs/sources/project/doc-style.md index 6ff3dfd1cf..20e4a9f10c 100644 --- a/docs/sources/project/doc-style.md +++ b/docs/sources/project/doc-style.md @@ -214,7 +214,7 @@ exactly what they see in their shell: * Indent shell examples by 4 spaces so they get rendered as code blocks. * Start typed commands with `$ ` (dollar space), so that they are easily -differentiated from program output. + differentiated from program output. * Program output has no prefix. * Comments begin with # (hash space). * In-container shell commands, begin with `$$ ` (dollar dollar space). @@ -232,7 +232,7 @@ following: * Point out potential issues or questions * Ask for help from experts in the company or the community * Encourage feedback from core developers and others involved in creating the -software being documented. + software being documented. Writing a PR that is singular in focus and has clear objectives will encourage all of the above. Done correctly, the process allows reviewers (maintainers and diff --git a/docs/sources/project/get-help.md b/docs/sources/project/get-help.md index 0f60f7a3f8..38daf097a0 100644 --- a/docs/sources/project/get-help.md +++ b/docs/sources/project/get-help.md @@ -2,103 +2,138 @@ page_title: Where to chat or get help page_description: Describes Docker's communication channels page_keywords: IRC, Google group, Twitter, blog, Stackoverflow + + # Where to chat or get help -There are several communications channels you can use to chat with Docker community members and developers. +There are several communications channels you can use to chat with Docker +community members and developers. + - - - + + - - + + - - + +
Internet Relay Chat (IRC) -

IRC a direct line to our most knowledgeable Docker users. The #docker and #docker-dev group on irc.freenode.net. IRC was first created in 1988. So, it is a rich chat protocol but it can overwhelm new users. You can search our chat archives.

- Read our IRC quickstart guide below for an easy way to get started. +
Internet Relay Chat (IRC) + +

+ IRC a direct line to our most knowledgeable Docker users. + The #docker and #docker-dev group on + irc.freenode.net. IRC was first created in 1988. + So, it is a rich chat protocol but it can overwhelm new users. You can search + our chat archives. +

+ Read our IRC quickstart guide below for an easy way to get started. +
Google GroupsThere are two groups. Docker-user is for people using Docker containers. The docker-dev group is for contributors and other people contributing to the Docker project.Google Groups + There are two groups. + Docker-user + is for people using Docker containers. + The docker-dev + group is for contributors and other people contributing to the Docker + project. +
TwitterYou can follow Docker's twitter to get updates on our products. You can also tweet us questions or just share blogs or stories.Twitter + You can follow Docker's twitter + to get updates on our products. You can also tweet us questions or just + share blogs or stories. +
StackoverflowStackoverflow has over 7000K Docker questions listed. We regularly monitor Docker questions and so do many other knowledgeable Docker users.Stack Overflow + Stack Overflow has over 7000K Docker questions listed. We regularly + monitor Docker questions + and so do many other knowledgeable Docker users. +
## IRC Quickstart -IRC can also be overwhelming for new users. This quickstart shows you the easiest way to connect to IRC. +IRC can also be overwhelming for new users. This quickstart shows you +the easiest way to connect to IRC. 1. In your browser open http://webchat.freenode.net - ![Login screen](/project/images/irc_connect.png) + ![Login screen](/project/images/irc_connect.png) 2. Fill out the form. - - - - - - - - - - - - - - -
NicknameThe short name you want to be known as in IRC.
Channels#docker
reCAPTCHAUse the value provided.
+ + + + + + + + + + + + + + + +
NicknameThe short name you want to be known as in IRC.
Channels#docker
reCAPTCHAUse the value provided.
3. Click "Connect". - The system connects you to chat. You'll see a lot of text. At the bottom of - the display is a command line. Just above the command line the system asks - you to register. - - ![Login screen](/project/images/irc_after_login.png) + The system connects you to chat. You'll see a lot of text. At the bottom of + the display is a command line. Just above the command line the system asks + you to register. + + ![Login screen](/project/images/irc_after_login.png) 4. In the command line, register your nickname. - /msg nickserv REGISTER password youremail@example.com - - ![Login screen](/project/images/register_nic.png) - - The IRC system sends an email to the address you - enter. The email contains instructions for completing your registration. - + /msg NickServ REGISTER password youremail@example.com + + ![Login screen](/project/images/register_nic.png) + + The IRC system sends an email to the address you + enter. The email contains instructions for completing your registration. + 5. Open your mail client and look for the email. - - ![Login screen](/project/images/register_email.png) - + + ![Login screen](/project/images/register_email.png) + 6. Back in the browser, complete the registration according to the email. - /msg NickServ VERIFY REGISTER moxiegirl_ acljtppywjnr - + /msg NickServ VERIFY REGISTER moxiegirl_ acljtppywjnr + 7. Join the `#docker` group using the following command. - /j #docker - - You can also join the `#docker-dev` group. - - /j #docker-dev - + /j #docker + + You can also join the `#docker-dev` group. + + /j #docker-dev + 8. To ask questions to the channel just type messages in the command line. ![Login screen](/project/images/irc_chat.png) @@ -108,12 +143,17 @@ IRC can also be overwhelming for new users. This quickstart shows you the easies ### Tips and learning more about IRC -Next time you return to log into chat, you'll need to re-enter your password on the command line using this command: +Next time you return to log into chat, you'll need to re-enter your password +on the command line using this command: + + /msg NickServ identify - /msg NickServ identify - If you forget or lose your password see the FAQ on freenode.net to learn how to recover it. - -This quickstart was meant to get you up and into IRC very quickly. If you find IRC useful there is a lot more to learn. Drupal, another open source project, actually has written a lot of good documentation about using IRC for their project (thanks Drupal!). + +This quickstart was meant to get you up and into IRC very quickly. If you find +IRC useful there is a lot more to learn. Drupal, another open source project, +actually has +written a lot of good documentation about using IRC for their project +(thanks Drupal!). diff --git a/docs/sources/project/images/gordon.jpeg b/docs/sources/project/images/gordon.jpeg index a815d8a2d5c866367ddde5ef21ae0237f275718a..8a0df7d4636103a27e9ebc1ad074209e47f9285a 100644 GIT binary patch literal 19941 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 literal 25387 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

dBE9?Dyx-V61VxJbc*U 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 QdYinDIm~HiK>rs12TCu2Gynhq diff --git a/docs/sources/project/make-a-contribution.md b/docs/sources/project/make-a-contribution.md index 9df0c8ac05..8a89ac058e 100644 --- a/docs/sources/project/make-a-contribution.md +++ b/docs/sources/project/make-a-contribution.md @@ -2,28 +2,78 @@ page_title: Make a project contribution page_description: Basic workflow for Docker contributions page_keywords: contribute, pull request, review, workflow, white-belt, black-belt, squash, commit + + + + + + # Make a project contribution -Contributing is a process where you work with Docker maintainers and the community to improve Docker. There is a formal process for contributing. We try to keep our contribution process simple so you want to come back. +Contributing is a process where you work with Docker maintainers and the +community to improve Docker. There is a formal process for contributing. +We try to keep our contribution process simple so you want to come back. -In this section, you will create a new branch and work on some Docker code that you choose. Before you work through this process, take a few minutes to read through the next section which explains our basic contribution workflow. +In this section, you will create a new branch and work on some Docker code +that you choose. Before you work through this process, take a few minutes to +read through the next section which explains our basic contribution workflow. ## The basic contribution workflow -You are about to work through our basic contribution workflow by fixing a single *white-belt* issue in the `docker/docker` repository. The workflow for fixing simple issues looks like this: +You are about to work through our basic contribution workflow by fixing a +single *white-belt* issue in the `docker/docker` repository. The workflow +for fixing simple issues looks like this: ![Simple process](/project/images/existing_issue.png) -All Docker repositories have code and documentation. This workflow works for either content type. For example, you can find and fix doc or code issues. Also, you can propose a new Docker feature or propose a new Docker tutorial. +All Docker repositories have code and documentation. This workflow works +for either content type. For example, you can find and fix doc or code issues. +Also, you can propose a new Docker feature or propose a new Docker tutorial. -Some workflow stages have slight differences for code or documentation contributions. When you reach that point in the flow, we make sure to tell you. +Some workflow stages have slight differences for code or documentation +contributions. When you reach that point in the flow, we make sure to tell you. ## Find and claim an existing issue -An existing issue is something reported by a Docker user. As issues come in, our maintainers triage them. Triage is its own topic. For now, it is important for you to know that triage includes ranking issues according to difficulty. +An existing issue is something reported by a Docker user. As issues come in, +our maintainers triage them. Triage is its own topic. For now, it is important +for you to know that triage includes ranking issues according to difficulty. -Triaged issues have either a **white-belt** or **black-belt** label. A **white-belt** issue is considered an easier issue. Issues can have more than one the **white-belt** label, for example, **bug**, **improvement**, **/project/doc**, and so forth. These other labels are their for filtering purposes but you might also find them helpful. +Triaged issues have either a white-belt +or black-belt label. +A white-belt issue is considered +an easier issue. Issues can have more than one label, for example, +bug, +improvement, +project/doc, and so forth. +These other labels are there for filtering purposes but you might also find +them helpful. In the next procedure, you find and claim an open white-belt issue. @@ -33,44 +83,48 @@ In the next procedure, you find and claim an open white-belt issue. 2. Click on the "Issues" link. - A list of the open issues appears. - - ![Open issues](/project/images/issue_list.png) + A list of the open issues appears. -3. Look for the **white-belt** items on the list. + ![Open issues](/project/images/issue_list.png) -4. Click on the "Labels" dropdown and select **white-belt**. +3. Look for the white-belt items on the list. - The system filters to show only open **white-belt** issues. +4. Click on the "labels" dropdown and select white-belt. + + The system filters to show only open white-belt issues. 5. Open an issue that interests you. - The comments on the issues can tell you both the problem and the potential - solution. - + The comments on the issues can tell you both the problem and the potential + solution. + 6. Make sure that no other user has chosen to work on the issue. We don't allow external contributors to assign issues to themselves, so you need to read the comments to find if a user claimed an issue by saying: - * "I'd love to give this a try~" - * "I'll work on this!" - * "I'll take this." + - "I'd love to give this a try~" + - "I'll work on this!" + - "I'll take this." The community is very good about claiming issues explicitly. 7. When you find an open issue that both interests you and is unclaimed, claim it yourself by adding a comment. - ![Easy issue](/project/images/easy_issue.png) + ![Easy issue](/project/images/easy_issue.png) + + This example uses issue 11038. Your issue # will be different depending on + what you claimed. - This example uses issue 11038. Your issue # will be different depending on - what you claimed. - 8. Make a note of the issue number; you'll need it later. ## Sync your fork and create a new branch -If you have followed along in this guide, you forked the `docker/docker` repository. Maybe that was an hour ago or a few days ago. In any case, before you start working on your issue, sync your repository with the upstream `docker/docker` master. Syncing ensures your repository has the latest changes. +If you have followed along in this guide, you forked the `docker/docker` +repository. Maybe that was an hour ago or a few days ago. In any case, before +you start working on your issue, sync your repository with the upstream +`docker/docker` master. Syncing ensures your repository has the latest +changes. To sync your repository: @@ -78,315 +132,335 @@ To sync your repository: 2. Change directory to the `docker-fork` root. - $ cd ~/repos/docker-fork + $ cd ~/repos/docker-fork 3. Checkout the master branch. - $ git checkout master - Switched to branch 'master' - Your branch is up-to-date with 'origin/master'. - - Recall that `origin/master` is a branch on your remote GitHub repository. + $ git checkout master + Switched to branch 'master' + Your branch is up-to-date with 'origin/master'. + + Recall that `origin/master` is a branch on your remote GitHub repository. 4. Make sure you have the upstream remote `docker/docker` by listing them. - $ git remote -v - origin https://github.com/moxiegirl/docker.git (fetch) - origin https://github.com/moxiegirl/docker.git (push) - upstream https://github.com/docker/docker.git (fetch) - upstream https://github.com/docker/docker.git ( - - If the `upstream` is missing, add it. - - $ git remote add upstream https://github.com/docker/docker.git + $ git remote -v + origin https://github.com/moxiegirl/docker.git (fetch) + origin https://github.com/moxiegirl/docker.git (push) + upstream https://github.com/docker/docker.git (fetch) + upstream https://github.com/docker/docker.git ( + + If the `upstream` is missing, add it. + + $ git remote add upstream https://github.com/docker/docker.git 5. Fetch all the changes from the `upstream/master` branch. - $ git fetch upstream/master - remote: Counting objects: 141, done. - remote: Compressing objects: 100% (29/29), done. - remote: Total 141 (delta 52), reused 46 (delta 46), pack-reused 66 - Receiving objects: 100% (141/141), 112.43 KiB | 0 bytes/s, done. - Resolving deltas: 100% (79/79), done. - From github.com:docker/docker - 9ffdf1e..01d09e4 docs -> upstream/docs - 05ba127..ac2521b master -> upstream/master - - This command says get all the changes from the `master` branch belonging to - the `upstream` remote. - + $ git fetch upstream/master + remote: Counting objects: 141, done. + remote: Compressing objects: 100% (29/29), done. + remote: Total 141 (delta 52), reused 46 (delta 46), pack-reused 66 + Receiving objects: 100% (141/141), 112.43 KiB | 0 bytes/s, done. + Resolving deltas: 100% (79/79), done. + From github.com:docker/docker + 9ffdf1e..01d09e4 docs -> upstream/docs + 05ba127..ac2521b master -> upstream/master + + This command says get all the changes from the `master` branch belonging to + the `upstream` remote. + 7. Rebase your local master with the `upstream/master`. - $ git rebase upstream/master - First, rewinding head to replay your work on top of it... - Fast-forwarded master to upstream/master. - - This command writes all the commits from the upstream branch into your local - branch. - + $ git rebase upstream/master + First, rewinding head to replay your work on top of it... + Fast-forwarded master to upstream/master. + + This command writes all the commits from the upstream branch into your local + branch. + 8. Check the status of your local branch. - $ git status - On branch master - Your branch is ahead of 'origin/master' by 38 commits. - (use "git push" to publish your local commits) - nothing to commit, working directory clean + $ git status + On branch master + Your branch is ahead of 'origin/master' by 38 commits. + (use "git push" to publish your local commits) + nothing to commit, working directory clean - Your local repository now has any changes from the `upstream` remote. You - need to push the changes to your own remote fork which is `origin/master`. + Your local repository now has any changes from the `upstream` remote. You + need to push the changes to your own remote fork which is `origin/master`. 9. Push the rebased master to `origin/master`. - $ git push - Username for 'https://github.com': moxiegirl - Password for 'https://moxiegirl@github.com': - Counting objects: 223, done. - Compressing objects: 100% (38/38), done. - Writing objects: 100% (69/69), 8.76 KiB | 0 bytes/s, done. - Total 69 (delta 53), reused 47 (delta 31) - To https://github.com/moxiegirl/docker.git - 8e107a9..5035fa1 master -> master - - If you check + $ git push + Username for 'https://github.com': moxiegirl + Password for 'https://moxiegirl@github.com': + Counting objects: 223, done. + Compressing objects: 100% (38/38), done. + Writing objects: 100% (69/69), 8.76 KiB | 0 bytes/s, done. + Total 69 (delta 53), reused 47 (delta 31) + To https://github.com/moxiegirl/docker.git + 8e107a9..5035fa1 master -> master 9. Create a new feature branch to work on your issue. - Your branch name should have the format `XXXX-descriptive` where `XXXX` is - the issue number you are working on. For example: + Your branch name should have the format `XXXX-descriptive` where `XXXX` is + the issue number you are working on. For example: - $ git checkout -b 11038-fix-rhel-link - Switched to a new branch '11038-fix-rhel-link' - - Your branch should be up-to-date with the upstream/master. Why? Because you - branched off a freshly synced master. Let's check this anyway in the next - step. + $ git checkout -b 11038-fix-rhel-link + Switched to a new branch '11038-fix-rhel-link' + + Your branch should be up-to-date with the upstream/master. Why? Because you + branched off a freshly synced master. Let's check this anyway in the next + step. 9. Rebase your branch from upstream/master. - $ git rebase upstream/master - Current branch 11038-fix-rhel-link is up to date. - - At this point, your local branch, your remote repository, and the Docker - repository all have identical code. You are ready to make changesfor your - issues. - + $ git rebase upstream/master + Current branch 11038-fix-rhel-link is up to date. + + At this point, your local branch, your remote repository, and the Docker + repository all have identical code. You are ready to make changesfor your + issues. + ## Work on your issue -The work you do for your issue depends on the specific issue you picked. This section gives you a step-by-step workflow. Where appropriate, it provides command examples. However, this is a generalized workflow, depending on your issue you may you may repeat steps or even skip some. How much time it takes you depends on you --- you could spend days or 30 minutes of your time. +The work you do for your issue depends on the specific issue you picked. +This section gives you a step-by-step workflow. Where appropriate, it provides +command examples. However, this is a generalized workflow, depending on your +issue you may you may repeat steps or even skip some. How much time it takes +you depends on you --- you could spend days or 30 minutes of your time. Follow this workflow as you work: 1. Review the appropriate style guide. - If you are changing code, review the coding style guide. Changing documentation? Review the - documentation style guide. + If you are changing code, review the coding style guide. Changing documentation? Review the + documentation style guide. 2. Make changes in your feature branch. - Your feature branch you created in the last section. Here you use the - development container. If you are making a code change, you can mount your - source into a development container and iterate that way. For documentation - alone, you can work on your local host. - - Review if you forgot the details - of working with a container. + Your feature branch you created in the last section. Here you use the + development container. If you are making a code change, you can mount your + source into a development container and iterate that way. For documentation + alone, you can work on your local host. + + Review if you forgot the details + of working with a container. 3. Test your changes as you work. - If you have followed along with the guide, you know the `make test` target - runs the entire test suite and `make docs` builds the documentation. If you - forgot the other test targets, see the documentation for testing both code and - documentation. + If you have followed along with the guide, you know the `make test` target + runs the entire test suite and `make docs` builds the documentation. If you + forgot the other test targets, see the documentation for testing both code and + documentation. 4. For code changes, add unit tests if appropriate. - If you add new functionality or change existing functionality, you should - add a unit test also. Use the existing test files for inspiration. Aren't - sure if you need tests? Skip this step; you can add them later in the - process if necessary. + If you add new functionality or change existing functionality, you should + add a unit test also. Use the existing test files for inspiration. Aren't + sure if you need tests? Skip this step; you can add them later in the + process if necessary. 5. Format your source files correctly. - - - - - - - - - - - - - - -
File typeHow to format
.go

Format .go files using the gofmt command. For example, if you edited the `docker.go` file you would format the file - like this: -

-

$ gofmt -s -w file.go

-

- Most file editors have a plugin to format for you. Check your editor's - documentation. -

-
.md and non-.go filesWrap lines to 80 characters.
- + + + + + + + + + + + + + + + + + +
File typeHow to format
.go +

+ Format .go files using the gofmt command. + For example, if you edited the `docker.go` file you would format the file + like this: +

+

$ gofmt -s -w file.go

+

+ Most file editors have a plugin to format for you. Check your editor's + documentation. +

+
.md and non-.go filesWrap lines to 80 characters.
6. List your changes. - $ git status - On branch 11038-fix-rhel-link - Changes not staged for commit: - (use "git add ..." to update what will be committed) - (use "git checkout -- ..." to discard changes in working directory) + $ git status + On branch 11038-fix-rhel-link + Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git checkout -- ..." to discard changes in working directory) + + modified: docs/sources/installation/mac.md + modified: docs/sources/installation/rhel.md + + The `status` command lists what changed in the repository. Make sure you see + the changes you expect. - modified: docs/sources/installation/mac.md - modified: docs/sources/installation/rhel.md - - The `status` command lists what changed in the repository. Make sure you see - the changes you expect. - 7. Add your change to Git. - $ git add docs/sources/installation/mac.md - $ git add docs/sources/installation/rhel.md - - + $ git add docs/sources/installation/mac.md + $ git add docs/sources/installation/rhel.md + + 8. Commit your changes making sure you use the `-s` flag to sign your work. - $ git commit -s -m "Fixing RHEL link" - + $ git commit -s -m "Fixing RHEL link" + 9. Push your change to your repository. - - $ git push --set-upstream origin 11038-fix-rhel-link - Username for 'https://github.com': moxiegirl - Password for 'https://moxiegirl@github.com': - Counting objects: 60, done. - Compressing objects: 100% (7/7), done. - Writing objects: 100% (7/7), 582 bytes | 0 bytes/s, done. - Total 7 (delta 6), reused 0 (delta 0) - To https://github.com/moxiegirl/docker.git - * [new branch] 11038-fix-rhel-link -> 11038-fix-rhel-link - Branch 11038-fix-rhel-link set up to track remote branch 11038-fix-rhel-link from origin. - + + $ git push --set-upstream origin 11038-fix-rhel-link + Username for 'https://github.com': moxiegirl + Password for 'https://moxiegirl@github.com': + Counting objects: 60, done. + Compressing objects: 100% (7/7), done. + Writing objects: 100% (7/7), 582 bytes | 0 bytes/s, done. + Total 7 (delta 6), reused 0 (delta 0) + To https://github.com/moxiegirl/docker.git + * [new branch] 11038-fix-rhel-link -> 11038-fix-rhel-link + Branch 11038-fix-rhel-link set up to track remote branch 11038-fix-rhel-link from origin. + 10. Open your fork on GitHub to see your change. ## Create a pull request to docker/docker -A pull request sends your code to the Docker maintainers for review. Your pull request goes from your forked repository to the `docker/docker` repository. You can see the list of active pull requests to Docker on GitHub. +A pull request sends your code to the Docker maintainers for review. Your pull +request goes from your forked repository to the `docker/docker` repository. +You can see the +list of active pull requests to Docker +on GitHub. To create a pull request for your change: 1. In a terminal window, go to the root of your `docker-fork` repository. - $ cd ~/repos/docker-fork + $ cd ~/repos/docker-fork 2. Checkout your feature branch. - $ git checkout 11038-fix-rhel-link - Already on '11038-fix-rhel-link' + $ git checkout 11038-fix-rhel-link + Already on '11038-fix-rhel-link' 3. Run the full test suite on your branch. - $ make test - - All the tests should pass. If they don't, find out why and correct the - situation. If you also modified the documentation, run `make docs` and - check your work. - + $ make test + + All the tests should pass. If they don't, find out why and correct the + situation. If you also modified the documentation, run `make docs` and + check your work. + 4. Update your remote repository with any changes that result from your last minute checks. - Use the `git add`, the `git commit -s`, and `git push` commands to do this. - + Use the `git add`, the `git commit -s`, and `git push` commands to do this. + 4. Fetch any of the last minute changes from `docker/docker`. - $ git fetch upstream master - From github.com:docker/docker - * branch master -> FETCH_HEAD + $ git fetch upstream master + From github.com:docker/docker + * branch master -> FETCH_HEAD 5. Squash your individual separate commits into one by using Git’s interactive rebase: - $ git rebase -i upstream/master - - This commit will open up your favorite editor with all the comments from - all your latest commits. - - pick 1a79f55 Tweak some of the other text for grammar - pick 53e4983 Fix a link - pick 3ce07bb Add a new line about RHEL - + $ git rebase -i upstream/master + + This commit will open up your favorite editor with all the comments from + all your latest commits. + + pick 1a79f55 Tweak some of the other text for grammar + pick 53e4983 Fix a link + pick 3ce07bb Add a new line about RHEL + 6. Replace the `pick` keyword with `squash` on all but the first commit. - - pick 1a79f55 Tweak some of the other text for grammar - squash 53e4983 Fix a link - squash 3ce07bb Add a new line about RHEL - - After closing the file, `git` opens your editor again to edit the commit - message. - + + pick 1a79f55 Tweak some of the other text for grammar + squash 53e4983 Fix a link + squash 3ce07bb Add a new line about RHEL + + After closing the file, `git` opens your editor again to edit the commit + message. + 7. Save your commit message. 8. Push any changes to your fork on GitHub. - $ git push origin 11038-fix-rhel-link - + $ git push origin 11038-fix-rhel-link + 9. Open your browser to your fork on GitHub. - You should see the latest activity from your branch. - - ![Latest commits](/project/images/latest_commits.png) + You should see the latest activity from your branch. + + ![Latest commits](/project/images/latest_commits.png) + - 10. Click "Compare & pull request". - The system displays the pull request dialog. - - ![PR dialog](/project/images/to_from_pr.png) - - The pull request compares your changes to the `master` branch on the `docker/docker` repository. + The system displays the pull request dialog. + + ![PR dialog](/project/images/to_from_pr.png) + + The pull request compares your changes to the `master` branch on the + `docker/docker` repository. 11. Edit the dialog's description and add a reference to the issue you are fixing. - GitHub helps you out by searching for the issue as you type. - - ![Fixes issue](/project/images/fixes_num.png) + GitHub helps you out by searching for the issue as you type. + + ![Fixes issue](/project/images/fixes_num.png) 12. Scroll down and verify the PR contains the commits and changes you expect. - For example, is the file count correct? Are the changes in the files what - you expect. - - ![Commits](/project/images/commits_expected.png) + For example, is the file count correct? Are the changes in the files what + you expect. + + ![Commits](/project/images/commits_expected.png) 13. Press "Create pull request". - The system creates the request and opens it for you in the `docker/docker` - repository. + The system creates the request and opens it for you in the `docker/docker` + repository. - ![Pull request made](/project/images/pull_request_made.png) + ![Pull request made](/project/images/pull_request_made.png) ## Your pull request under review -At this point, your pull request is reviewed. The first reviewer is Gordon. He might who might look slow in this picture: +At this point, your pull request is reviewed. The first reviewer is Gordon. +He might who might look slow in this picture: ![Gordon](/project/images/gordon.jpeg) -He is actually pretty fast over a network. He checks your pull request (PR) for common problems like missing signatures. If Gordon finds a problem, he'll send an email to your GitHub user. +He is actually pretty fast over a network. He checks your pull request (PR) +for common problems like missing signatures. If Gordon finds a problem, he'll +send an email to your GitHub user. -After Gordon, the core Docker maintainers look at your pull request and comment on it. The shortest comment you might see is `LGTM` which means **l**ooks-**g**ood-**t**o-**m**e. If you get an `LGTM`, that is a good thing, you passed that review. +After Gordon, the core Docker maintainers look at your pull request and comment +on it. The shortest comment you might see is `LGTM` which means +**l**ooks-**g**ood-**t**o-**m**e. If you get an `LGTM`, that is a good thing, +you passed that review. -For complex changes, maintainers may ask you questions or ask you to change something about your submission. All maintainer comments on a PR go to the email address associated with your GitHub account. Any GitHub user who "participates" in a PR receives an email to. Participating means creating or commenting on a PR. +For complex changes, maintainers may ask you questions or ask you to change +something about your submission. All maintainer comments on a PR go to the +email address associated with your GitHub account. Any GitHub user who +"participates" in a PR receives an email to. Participating means creating or +commenting on a PR. -Our maintainers are very experienced Docker users and open source contributors. So, they value your time and will try to work efficiently with you by keeping their comments specific and brief. If they ask you to make a change, you'll need to update your pull request with additional changes. +Our maintainers are very experienced Docker users and open source contributors. +So, they value your time and will try to work efficiently with you by keeping +their comments specific and brief. If they ask you to make a change, you'll +need to update your pull request with additional changes. To update your existing pull request: @@ -394,44 +468,50 @@ To update your existing pull request: 2. Commit the change with the `git commit --amend` command. - $ git commit --amend - - Git opens an editor containing your last commit message. - + $ git commit --amend + + Git opens an editor containing your last commit message. + 3. Adjust your last comment to reflect this new change. - Added a new sentence per Anaud's suggestion + Added a new sentence per Anaud's suggestion - Signed-off-by: Mary Anthony + Signed-off-by: Mary Anthony - # Please enter the commit message for your changes. Lines starting - # with '#' will be ignored, and an empty message aborts the commit. - # On branch 11038-fix-rhel-link - # Your branch is up-to-date with 'origin/11038-fix-rhel-link'. - # - # Changes to be committed: - # modified: docs/sources/installation/mac.md - # modified: docs/sources/installation/rhel.md + # Please enter the commit message for your changes. Lines starting + # with '#' will be ignored, and an empty message aborts the commit. + # On branch 11038-fix-rhel-link + # Your branch is up-to-date with 'origin/11038-fix-rhel-link'. + # + # Changes to be committed: + # modified: docs/sources/installation/mac.md + # modified: docs/sources/installation/rhel.md 4. Push to your origin. - $ git push origin - + $ git push origin + 5. Open your browser to your pull request on GitHub. - You should see your pull request now contains your newly pushed code. + You should see your pull request now contains your newly pushed code. 6. Add a comment to your pull request. - - GitHub only notifies PR participants when you comment. For example, you can - mention that you updated your PR. Your comment alerts the maintainers that - you made an update. - -A change requires LGTMs from an absolute majority of an affected component's maintainers. For example, if you change `docs/` and `registry/` code, an absolute majority of the `docs/` and the `registry/` maintainers must approve your PR. Once you get approval, we merge your pull request into Docker's `master` cod branch. + + GitHub only notifies PR participants when you comment. For example, you can + mention that you updated your PR. Your comment alerts the maintainers that + you made an update. + +A change requires LGTMs from an absolute majority of an affected component's +maintainers. For example, if you change `docs/` and `registry/` code, an +absolute majority of the `docs/` and the `registry/` maintainers must approve +your PR. Once you get approval, we merge your pull request into Docker's +`master` code branch. ## After the merge -It can take time to see a merged pull request in Docker's official release. A master build is available almost immediately though. Docker builds and updates its development binaries after each merge to `master`. +It can take time to see a merged pull request in Docker's official release. +A master build is available almost immediately though. Docker builds and +updates its development binaries after each merge to `master`. 1. Browse to https://master.dockerproject.com/. @@ -439,15 +519,22 @@ It can take time to see a merged pull request in Docker's official release. A ma 3. Download and run the binary. - You might want to run the binary in a container though. This - will keep your local host environment clean. + You might want to run the binary in a container though. This + will keep your local host environment clean. 4. View any documentation changes at docs.master.dockerproject.com. -Once you've verified everything merged, feel free to delete your feature branch from your fork. For information on how to do this, see the GitHub help on deleting branches. +Once you've verified everything merged, feel free to delete your feature branch +from your fork. For information on how to do this, + +see the GitHub help on deleting branches. ## Where to go next -At this point, you have completed all the basic tasks in our contributors guide. If you enjoyed contributing, let us know by completing another **white-belt** issue or two. We really appreciate the help. +At this point, you have completed all the basic tasks in our contributors guide. +If you enjoyed contributing, let us know by completing another +white-belt +issue or two. We really appreciate the help. -If you are very experienced and want to make a major change, go onto [learn about advanced contributing](/project/advanced-contributing). \ No newline at end of file +If you are very experienced and want to make a major change, go onto +[learn about advanced contributing](/project/advanced-contributing). diff --git a/docs/sources/project/set-up-dev-env.md b/docs/sources/project/set-up-dev-env.md index f7b5f6e6da..2a30f2b3bb 100644 --- a/docs/sources/project/set-up-dev-env.md +++ b/docs/sources/project/set-up-dev-env.md @@ -2,6 +2,14 @@ page_title: Work with a development container page_description: How to use Docker's development environment page_keywords: development, inception, container, image Dockerfile, dependencies, Go, artifacts + + + + # Work with a development container In this section, you learn to develop like a member of Docker's core team. @@ -11,178 +19,176 @@ dependencies: system libraries and binaries, go environment, go dependencies, etc. Docker's development environment is itself, ultimately a Docker container. -You use the `docker` repository and its `Dockerfile` to create a Docker image, run a Docker container, and develop code in the container. Docker itself builds, tests, and releases new Docker versions using this container. - -If you followed the procedures that set up the prerequisites, you should have a fork of the -`docker/docker` repository. You also created a branch called `dry-run-test`. In this section, you continue working with your fork on this branch. +You use the `docker` repository and its `Dockerfile` to create a Docker image, +run a Docker container, and develop code in the container. Docker itself builds, +tests, and releases new Docker versions using this container. +If you followed the procedures that +set up the prerequisites, you should have a fork of the `docker/docker` +repository. You also created a branch called `dry-run-test`. In this section, +you continue working with your fork on this branch. ## Clean your host of Docker artifacts -Docker developers run the latest stable release of the Docker software; Or Boot2docker and Docker if their machine is Mac OS X. They clean their local hosts of unnecessary Docker artifacts such as stopped containers or unused images. Cleaning unnecessary artifacts isn't strictly necessary but it is good practice, so it is included here. +Docker developers run the latest stable release of the Docker software; Or +Boot2docker and Docker if their machine is Mac OS X. They clean their local +hosts of unnecessary Docker artifacts such as stopped containers or unused +images. Cleaning unnecessary artifacts isn't strictly necessary but it is +good practice, so it is included here. To remove unnecessary artifacts. 1. Verify that you have no unnecessary containers running on your host. - $ docker ps - - You should see something similar to the following: - - - - - - - - - - - - -
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
+ $ docker ps - There are no running containers on this host. If you have running but unused - containers, stop and then remove them with the `docker stop` and `docker rm` - commands. + You should see something similar to the following: + + + + + + + + + + + +
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
+ + There are no running containers on this host. If you have running but unused + containers, stop and then remove them with the `docker stop` and `docker rm` + commands. 2. Verify that your host has no dangling images. - $ docker images - - You should see something similar to the following: - - - - - - - - - - -
REPOSITORYTAGIMAGE IDCREATEDVIRTUAL SIZE
+ $ docker images - This host has no images. You may have one or more _dangling_ images. A - dangling image is not used by a running container and is not an ancestor of - another image on your system. A fast way to remove dangling containers is - the following: + You should see something similar to the following: - $ docker rmi -f $(docker images -q -a -f dangling=true) - - This command uses `docker images` to lists all images (`-a` flag) by numeric - IDs (`-q` flag) and filter them to find dangling images (`-f - dangling=true`). Then, the `docker rmi` command forcibly (`-f` flag) removes - the resulting list. To remove just one image, use the `docker rmi ID` - command. + + + + + + + + +
REPOSITORYTAGIMAGE IDCREATEDVIRTUAL SIZE
+ + This host has no images. You may have one or more _dangling_ images. A + dangling image is not used by a running container and is not an ancestor of + another image on your system. A fast way to remove dangling containers is + the following: + + $ docker rmi -f $(docker images -q -a -f dangling=true) + + This command uses `docker images` to lists all images (`-a` flag) by numeric + IDs (`-q` flag) and filter them to find dangling images (`-f + dangling=true`). Then, the `docker rmi` command forcibly (`-f` flag) removes + the resulting list. To remove just one image, use the `docker rmi ID` + command. ## Build an image -If you followed the last procedure, your host is clean of unnecessary images and containers. In this section, you build an image from the Docker development environment. +If you followed the last procedure, your host is clean of unnecessary images +and containers. In this section, you build an image from the Docker development +environment. 1. Open a terminal. - Mac users, use `boot2docker status` to make sure Boot2Docker is running. You - may need to run `$(boot2docker shellinit)` to initialize your shell - environment. + Mac users, use `boot2docker status` to make sure Boot2Docker is running. You + may need to run `$(boot2docker shellinit)` to initialize your shell + environment. 3. Change into the root of your forked repository. - $ cd ~/repos/docker-fork + $ cd ~/repos/docker-fork 4. Ensure you are on your `dry-run-test` branch. - $ git checkout dry-run-test + $ git checkout dry-run-test 5. Compile your development environment container into an image. - $ docker build -t dry-run-test . + $ docker build -t dry-run-test . - The `docker build` command returns informational message as it runs. The - first build may take a few minutes to create an image. Using the - instructions in the `Dockerfile`, the build may need to download source and - other images. A successful build returns a final status message similar to - the following: + The `docker build` command returns informational message as it runs. The + first build may take a few minutes to create an image. Using the + instructions in the `Dockerfile`, the build may need to download source and + other images. A successful build returns a final status message similar to + the following: - Successfully built 676815d59283 + Successfully built 676815d59283 6. List your Docker images again. - $ docker images + $ docker images - You should see something similar to this: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
REPOSTITORYTAGIMAGE IDCREATEDVIRTUAL SIZE
dry-run-testlatest663fbee70028About a minute ago
ubuntutrusty2d24f826cb162 days ago188.3 MB
ubuntutrusty-20150218.12d24f826cb162 days ago188.3 MB
ubuntu14.042d24f826cb162 days ago188.3 MB
ubuntu14.04.22d24f826cb162 days ago188.3 MB
ubuntulatest2d24f826cb162 days ago188.3 MB
+ You should see something similar to this: - Locate your new `dry-run-test` image in the list. You should also see a - number of `ubuntu` images. The build process creates these. They are the - ancestors of your new Docker development image. When you next rebuild your - image, the build process reuses these ancestors images if they exist. - - Keeping the ancestor images improves the build performance. When you rebuild - the child image, the build process uses the local ancestors rather than - retrieving them from the Hub. The build process gets new ancestors only if - DockerHub has updated versions. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
REPOSTITORYTAGIMAGE IDCREATEDVIRTUAL SIZE
dry-run-testlatest663fbee70028About a minute ago
ubuntutrusty2d24f826cb162 days ago188.3 MB
ubuntutrusty-20150218.12d24f826cb162 days ago188.3 MB
ubuntu14.042d24f826cb162 days ago188.3 MB
ubuntu14.04.22d24f826cb162 days ago188.3 MB
ubuntulatest2d24f826cb162 days ago188.3 MB
+ + Locate your new `dry-run-test` image in the list. You should also see a + number of `ubuntu` images. The build process creates these. They are the + ancestors of your new Docker development image. When you next rebuild your + image, the build process reuses these ancestors images if they exist. + + Keeping the ancestor images improves the build performance. When you rebuild + the child image, the build process uses the local ancestors rather than + retrieving them from the Hub. The build process gets new ancestors only if + DockerHub has updated versions. ## Start a container and run a test @@ -192,155 +198,153 @@ build and run a `docker` binary in your container. 1. Open two additional terminals on your host. - At this point, you'll have about three terminals open. + At this point, you'll have about three terminals open. - ![Multiple terminals](/project/images/three_terms.png) + ![Multiple terminals](/project/images/three_terms.png) + + Mac OSX users, make sure you run `$(boot2docker shellinit)` in any new + terminals. - Mac OSX users, make sure you run `$(boot2docker shellinit)` in any new - terminals. - 2. In a terminal, create a new container from your `dry-run-test` image. - $ docker run --privileged --rm -ti dry-run-test /bin/bash - root@5f8630b873fe:/go/src/github.com/docker/docker# + $ docker run --privileged --rm -ti dry-run-test /bin/bash + root@5f8630b873fe:/go/src/github.com/docker/docker# - The command creates a container from your `dry-run-test` image. It opens an - interactive terminal (`-ti`) running a `/bin/bash shell`. The - `--privileged` flag gives the container access to kernel features and device - access. It is this flag that allows you to run a container in a container. - Finally, the `-rm` flag instructs Docker to remove the container when you - exit the `/bin/bash` shell. - - The container includes the source of your image repository in the - `/go/src/github.com/docker/docker` directory. Try listing the contents to - verify they are the same as that of your `docker-fork` repo. - - ![List example](/project/images/list_example.png) + The command creates a container from your `dry-run-test` image. It opens an + interactive terminal (`-ti`) running a `/bin/bash shell`. The + `--privileged` flag gives the container access to kernel features and device + access. It is this flag that allows you to run a container in a container. + Finally, the `-rm` flag instructs Docker to remove the container when you + exit the `/bin/bash` shell. + + The container includes the source of your image repository in the + `/go/src/github.com/docker/docker` directory. Try listing the contents to + verify they are the same as that of your `docker-fork` repo. + + ![List example](/project/images/list_example.png) 3. Investigate your container bit. - If you do a `go version` you'll find the `go` language is part of the - container. - - root@31ed86e9ddcf:/go/src/github.com/docker/docker# go version - go version go1.4.2 linux/amd64 - - Similarly, if you do a `docker version` you find the container - has no `docker` binary. - - root@31ed86e9ddcf:/go/src/github.com/docker/docker# docker version - bash: docker: command not found - - You will create one in the next steps. - + If you do a `go version` you'll find the `go` language is part of the + container. + + root@31ed86e9ddcf:/go/src/github.com/docker/docker# go version + go version go1.4.2 linux/amd64 + + Similarly, if you do a `docker version` you find the container + has no `docker` binary. + + root@31ed86e9ddcf:/go/src/github.com/docker/docker# docker version + bash: docker: command not found + + You will create one in the next steps. + 4. From the `/go/src/github.com/docker/docker` directory make a `docker` binary with the `make.sh` script. - root@5f8630b873fe:/go/src/github.com/docker/docker# project/make.sh binary - You only call `project/make.sh` to build a binary _inside_ a Docker - development container as you are now. On your host, you'll use `make` - commands (more about this later). - - As it makes the binary, the `make.sh` script reports the build's progress. - When the command completes successfully, you should see the following - output: - - ---> Making bundle: ubuntu (in bundles/1.5.0-dev/ubuntu) - Created package {:path=>"lxc-docker-1.5.0-dev_1.5.0~dev~git20150223.181106.0.1ab0d23_amd64.deb"} - Created package {:path=>"lxc-docker_1.5.0~dev~git20150223.181106.0.1ab0d23_amd64.deb"} + root@5f8630b873fe:/go/src/github.com/docker/docker# project/make.sh binary + + You only call `project/make.sh` to build a binary _inside_ a Docker + development container as you are now. On your host, you'll use `make` + commands (more about this later). + + As it makes the binary, the `make.sh` script reports the build's progress. + When the command completes successfully, you should see the following + output: + + ---> Making bundle: ubuntu (in bundles/1.5.0-dev/ubuntu) + Created package {:path=>"lxc-docker-1.5.0-dev_1.5.0~dev~git20150223.181106.0.1ab0d23_amd64.deb"} + Created package {:path=>"lxc-docker_1.5.0~dev~git20150223.181106.0.1ab0d23_amd64.deb"} - 5. List all the contents of the `binary` directory. - root@5f8630b873fe:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary/ - docker docker-1.5.0-dev docker-1.5.0-dev.md5 docker-1.5.0-dev.sha256 - - You should see that `binary` directory, just as it sounds, contains the - made binaries. + root@5f8630b873fe:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary/ + docker docker-1.5.0-dev docker-1.5.0-dev.md5 docker-1.5.0-dev.sha256 + + You should see that `binary` directory, just as it sounds, contains the + made binaries. 6. Copy the `docker` binary to the `/usr/bin` of your container. - root@5f8630b873fe:/go/src/github.com/docker/docker# cp bundles/1.5.0-dev/binary/docker /usr/bin - + root@5f8630b873fe:/go/src/github.com/docker/docker# cp bundles/1.5.0-dev/binary/docker /usr/bin + 7. Inside your container, check your Docker version. - root@5f8630b873fe:/go/src/github.com/docker/docker# docker --version - Docker version 1.5.0-dev, build 6e728fb - - Inside the container you are running a development version. This is version - on the current branch it reflects the value of the `VERSION` file at the - root of your `docker-fork` repository. + root@5f8630b873fe:/go/src/github.com/docker/docker# docker --version + Docker version 1.5.0-dev, build 6e728fb + + Inside the container you are running a development version. This is version + on the current branch it reflects the value of the `VERSION` file at the + root of your `docker-fork` repository. 8. Start a `docker` daemon running inside your container. - root@5f8630b873fe:/go/src/github.com/docker/docker# docker -dD - - The `-dD` flag starts the daemon in debug mode; You'll find this useful - when debugging your code. - + root@5f8630b873fe:/go/src/github.com/docker/docker# docker -dD + + The `-dD` flag starts the daemon in debug mode; You'll find this useful + when debugging your code. + 9. Bring up one of the terminals on your local host. 10. List your containers and look for the container running the `dry-run-test` image. - $ docker ps - - - - - - - - - - - - - - - - - - - - - -
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
474f07652525dry-run-test:latest"hack/dind /bin/bash14 minutes agoUp 14 minutestender_shockley
- - In this example, the container's name is `tender_shockley`; yours will be - different. - + $ docker ps + + + + + + + + + + + + + + + + + + + + +
CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
474f07652525dry-run-test:latest"hack/dind /bin/bash14 minutes agoUp 14 minutestender_shockley
+ + In this example, the container's name is `tender_shockley`; yours will be + different. + 11. From the terminal, start another shell on your Docker development container. - $ docker exec -it tender_shockley bash - - At this point, you have two terminals both with a shell open into your - development container. One terminal is running a debug session. The other - terminal is displaying a `bash` prompt. + $ docker exec -it tender_shockley bash + + At this point, you have two terminals both with a shell open into your + development container. One terminal is running a debug session. The other + terminal is displaying a `bash` prompt. 12. At the prompt, test the Docker client by running the `hello-world` container. - root@9337c96e017a:/go/src/github.com/docker/docker# docker run hello-world - - You should see the image load and return. Meanwhile, you - can see the calls made via the debug session in your other terminal. + root@9337c96e017a:/go/src/github.com/docker/docker# docker run hello-world + + You should see the image load and return. Meanwhile, you + can see the calls made via the debug session in your other terminal. + + ![List example](/project/images/three_running.png) + - ![List example](/project/images/three_running.png) - - ## Restart a container with your source -At this point, you have experienced the "Docker inception" technique. That is, you have: +At this point, you have experienced the "Docker inception" technique. That is, +you have: * built a Docker image from the Docker repository * created and started a Docker development container from that image * built a Docker binary inside of your Docker development container * launched a `docker` daemon using your newly compiled binary -* called the `docker` client to run a `hello-world` container inside your development container +* called the `docker` client to run a `hello-world` container inside + your development container When you really get to developing code though, you'll want to iterate code changes and builds inside the container. For that you need to mount your local @@ -349,67 +353,67 @@ Docker repository source into your Docker container. Try that now. 1. If you haven't already, exit out of BASH shells in your running Docker container. - If you have followed this guide exactly, exiting out your BASH shells stops - the running container. You can use the `docker ps` command to verify the - development container is stopped. All of your terminals should be at the - local host prompt. - + If you have followed this guide exactly, exiting out your BASH shells stops + the running container. You can use the `docker ps` command to verify the + development container is stopped. All of your terminals should be at the + local host prompt. + 2. Choose a terminal and make sure you are in your `docker-fork` repository. - $ pwd - /Users/mary/go/src/github.com/moxiegirl/docker-fork - - Your location will be different because it reflects your environment. + $ pwd + /Users/mary/go/src/github.com/moxiegirl/docker-fork + + Your location will be different because it reflects your environment. 3. Create a container using `dry-run-test` but this time mount your repository onto the `/go` directory inside the container. - $ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/docker/docker dry-run-test /bin/bash + $ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/docker/docker dry-run-test /bin/bash - When you pass `pwd`, `docker` resolves it to your current directory. + When you pass `pwd`, `docker` resolves it to your current directory. 4. From inside the container, list your `binary` directory. - root@074626fc4b43:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary - ls: cannot access binary: No such file or directory - - Your `dry-run-test` image does not retain any of the changes you made inside - the container. This is the expected behavior for a container. - + root@074626fc4b43:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary + ls: cannot access binary: No such file or directory + + Your `dry-run-test` image does not retain any of the changes you made inside + the container. This is the expected behavior for a container. + 5. In a fresh terminal on your local host, change to the `docker-fork` root. - $ cd ~/repos/docker-fork/ + $ cd ~/repos/docker-fork/ 6. Create a fresh binary but this time use the `make` command. - $ make BINDDIR=. binary - - The `BINDDIR` flag is only necessary on Mac OS X but it won't hurt to pass - it on Linux command line. The `make` command, like the `make.sh` script - inside the container, reports its progress. When the make succeeds, it - returns the location of the new binary. - + $ make BINDDIR=. binary + + The `BINDDIR` flag is only necessary on Mac OS X but it won't hurt to pass + it on Linux command line. The `make` command, like the `make.sh` script + inside the container, reports its progress. When the make succeeds, it + returns the location of the new binary. + 7. Back in the terminal running the container, list your `binary` directory. - root@074626fc4b43:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary - docker docker-1.5.0-dev docker-1.5.0-dev.md5 docker-1.5.0-dev.sha256 - - The compiled binaries created from your repository on your local host are - now available inside your running Docker development container. - + root@074626fc4b43:/go/src/github.com/docker/docker# ls bundles/1.5.0-dev/binary + docker docker-1.5.0-dev docker-1.5.0-dev.md5 docker-1.5.0-dev.sha256 + + The compiled binaries created from your repository on your local host are + now available inside your running Docker development container. + 8. Repeat the steps you ran in the previous procedure. - * copy the binary inside the development container using - `cp bundles/1.5.0-dev/binary/docker /usr/bin` - * start `docker -dD` to launch the Docker daemon inside the container - * run `docker ps` on local host to get the development container's name - * connect to your running container `docker exec -it container_name bash` - * use the `docker run hello-world` command to create and run a container inside your development container - - + * copy the binary inside the development container using + `cp bundles/1.5.0-dev/binary/docker /usr/bin` + * start `docker -dD` to launch the Docker daemon inside the container + * run `docker ps` on local host to get the development container's name + * connect to your running container `docker exec -it container_name bash` + * use the `docker run hello-world` command to create and run a container + inside your development container + ## Where to go next -Congratulations, you have successfully achieved Docker inception. At this point, you've set up your development environment and verified almost all the essential processes you need to contribute. Of course, before you start contributing, [you'll need to learn one more piece of the development environment, the test framework](/project/test-and-docs/). - - - +Congratulations, you have successfully achieved Docker inception. At this point, +you've set up your development environment and verified almost all the essential +processes you need to contribute. Of course, before you start contributing, +[you'll need to learn one more piece of the development environment, the test framework](/project/test-and-docs/). diff --git a/docs/sources/project/set-up-prereqs.md b/docs/sources/project/set-up-prereqs.md index 30fd0d9c6c..4962c0c799 100644 --- a/docs/sources/project/set-up-prereqs.md +++ b/docs/sources/project/set-up-prereqs.md @@ -4,7 +4,9 @@ page_keywords: GitHub account, repository, clone, fork, branch, upstream, Git, G # Set up the prerequisites -Work through this page to set up the software and host environment you need to contribute. You'll find instructions for configuring your `git` repository and creating a fork you'll use later in the guide. +Work through this page to set up the software and host environment you need to +contribute. You'll find instructions for configuring your `git` repository and +creating a fork you'll use later in the guide. ## Get the Required Software @@ -15,7 +17,9 @@ Before you begin contributing you must have: * `make` * `docker` -You'll notice that `go`, the language that Docker is written in, is not listed. That's because you don't need it installed; Docker's development environment provides it for you. You'll learn more about the development environment later. +You'll notice that `go`, the language that Docker is written in, is not listed. +That's because you don't need it installed; Docker's development environment +provides it for you. You'll learn more about the development environment later. ### Get a GitHub account @@ -23,58 +27,66 @@ To contribute to the Docker project, you will need a GitHub account. A free account is fine. All the Docker project repositories are public and visible to everyone. -You should also have some experience using both the GitHub application and `git` on the command line. +You should also have some experience using both the GitHub application and `git` +on the command line. ### Install git Install `git` on your local system. You can check if `git` is on already on your system and properly installed with the following command: - $ git --version + $ git --version -This documentation is written using `git` version 2.2.2. Your version may be different depending on your OS. +This documentation is written using `git` version 2.2.2. Your version may be +different depending on your OS. ### Install make Install `make`. You can check if `make` is on your system with the following command: - $ make -v + $ make -v -This documentation is written using GNU Make 3.81. Your version may be different depending on your OS. +This documentation is written using GNU Make 3.81. Your version may be different +depending on your OS. ### Install or upgrade Docker -If you haven't already, install the Docker software using the instructions for your operating system. If you have an existing installation, check your version and make sure you have the latest Docker. +If you haven't already, install the Docker software using the +instructions for your operating system. +If you have an existing installation, check your version and make sure you have +the latest Docker. To check if `docker` is already installed on Linux: - $ docker --version - Docker version 1.5.0, build a8a31ef + $ docker --version + Docker version 1.5.0, build a8a31ef On Mac OS X or Windows, you should have installed Boot2Docker which includes Docker. You'll need to verify both Boot2Docker and then Docker. This documentation was written on OS X using the following versions. + $ boot2docker version + Boot2Docker-cli version: v1.5.0 + Git commit: ccd9032 - $ boot2docker version - Boot2Docker-cli version: v1.5.0 - Git commit: ccd9032 - - $ docker --version - Docker version 1.5.0, build a8a31ef + $ docker --version + Docker version 1.5.0, build a8a31ef ## Linux users and sudo -This guide assumes you have added your user to the `docker` group on your system. To check, list the group's contents: +This guide assumes you have added your user to the `docker` group on your system. +To check, list the group's contents: - $ getent group docker - docker:x:999:ubuntu + $ getent group docker + docker:x:999:ubuntu -If the command returns no matches, you have two choices. You can preface this guide's `docker` commands with `sudo` as you work. Alternatively, you can add your user to the `docker` group as follows: +If the command returns no matches, you have two choices. You can preface this +guide's `docker` commands with `sudo` as you work. Alternatively, you can add +your user to the `docker` group as follows: - $ sudo usermod -aG docker ubuntu + $ sudo usermod -aG docker ubuntu You must log out and back in for this modification to take effect. @@ -82,7 +94,8 @@ You must log out and back in for this modification to take effect. ## Fork and clone the Docker code When contributing, you first fork the Docker code repository. A fork copies -a repository at a particular point in time. GitHub tracks for you where a fork originates. +a repository at a particular point in time. GitHub tracks for you where a fork +originates. As you make contributions, you change your fork's code. When you are ready, you make a pull request back to the original Docker repository. If you aren't @@ -97,202 +110,209 @@ To fork and clone Docker: 3. Click the "Fork" button in the upper right corner of the GitHub interface. - ![Branch Signature](/project/images/fork_docker.png) + ![Branch Signature](/project/images/fork_docker.png) + + GitHub forks the repository to your GitHub account. The original + `docker/docker` repository becomes a new fork `YOUR_ACCOUNT/docker` under + your account. - GitHub forks the repository to your GitHub account. The original - `docker/docker` repository becomes a new fork `YOUR_ACCOUNT/docker` under - your account. - 4. Copy your fork's clone URL from GitHub. - GitHub allows you to use HTTPS or SSH protocols for clones. You can use the - `git` command line or clients like Subversion to clone a repository. - - ![Copy clone URL](/project/images/copy_url.png) - - This guide assume you are using the HTTPS protocol and the `git` command - line. If you are comfortable with SSH and some other tool, feel free to use - that instead. You'll need to convert what you see in the guide to what is - appropriate to your tool. - + GitHub allows you to use HTTPS or SSH protocols for clones. You can use the + `git` command line or clients like Subversion to clone a repository. + + ![Copy clone URL](/project/images/copy_url.png) + + This guide assume you are using the HTTPS protocol and the `git` command + line. If you are comfortable with SSH and some other tool, feel free to use + that instead. You'll need to convert what you see in the guide to what is + appropriate to your tool. + 5. Open a terminal window on your local host and change to your home directory. - $ cd ~ - + $ cd ~ + 6. Create a `repos` directory. - $ mkdir repos + $ mkdir repos 7. Change into your `repos` directory. - $ cd repos + $ cd repos -5. Clone the fork to your local host into a repository called `docker-fork`. +5. Clone the fork to your local host into a repository called `docker-fork`. + + $ git clone https://github.com/moxiegirl/docker.git docker-fork + + Naming your local repo `docker-fork` should help make these instructions + easier to follow; experienced coders don't typically change the name. - $ git clone https://github.com/moxiegirl/docker.git docker-fork - - Naming your local repo `docker-fork` should help make these instructions - easier to follow; experienced coders don't typically change the name. - 6. Change directory into your new `docker-fork` directory. - $ cd docker-fork - - Take a moment to familiarize yourself with the repository's contents. List - the contents. - - + $ cd docker-fork + + Take a moment to familiarize yourself with the repository's contents. List + the contents. + ## Set your signature and an upstream remote -When you contribute to Docker, you must certify you agree with the Developer Certificate of Origin. You indicate your agreement by signing your `git` commits like this: +When you contribute to Docker, you must certify you agree with the +Developer Certificate of Origin. +You indicate your agreement by signing your `git` commits like this: - Signed-off-by: Pat Smith + Signed-off-by: Pat Smith -To create a signature, you configure your username and email address in Git. You can set these globally or locally on just your `docker-fork` repository. You must sign with your real name. We don't accept anonymous contributions or contributions through pseudonyms. +To create a signature, you configure your username and email address in Git. +You can set these globally or locally on just your `docker-fork` repository. +You must sign with your real name. We don't accept anonymous contributions or +contributions through pseudonyms. -As you change code in your fork, you'll want to keep it in sync with the changes others make in the `docker/docker` repository. To make syncing easier, you'll also add a _remote_ called `upstream` that points to `docker/docker`. A remote is just another a project version hosted on the internet or network. +As you change code in your fork, you'll want to keep it in sync with the changes +others make in the `docker/docker` repository. To make syncing easier, you'll +also add a _remote_ called `upstream` that points to `docker/docker`. A remote +is just another a project version hosted on the internet or network. To configure your username, email, and add a remote: - + 1. Change to the root of your `docker-fork` repository. - $ cd docker-fork + $ cd docker-fork -2. Set your `user.name` for the repository. +2. Set your `user.name` for the repository. + + $ git config --local user.name "FirstName LastName" - $ git config --local user.name "FirstName LastName" - 3. Set your `user.email` for the repository. - $ git config --local user.email "emailname@mycompany.com" - + $ git config --local user.email "emailname@mycompany.com" + 4. Set your local repo to track changes upstream, on the `docker` repository. - $ git remote add upstream https://github.com/docker/docker.git + $ git remote add upstream https://github.com/docker/docker.git 7. Check the result in your `git` configuration. - $ git config --local -l - core.repositoryformatversion=0 - core.filemode=true - core.bare=false - core.logallrefupdates=true - remote.origin.url=https://github.com/moxiegirl/docker.git - remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* - branch.master.remote=origin - branch.master.merge=refs/heads/master - user.name=Mary Anthony - user.email=mary@docker.com - remote.upstream.url=https://github.com/docker/docker.git - remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/* + $ git config --local -l + core.repositoryformatversion=0 + core.filemode=true + core.bare=false + core.logallrefupdates=true + remote.origin.url=https://github.com/moxiegirl/docker.git + remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* + branch.master.remote=origin + branch.master.merge=refs/heads/master + user.name=Mary Anthony + user.email=mary@docker.com + remote.upstream.url=https://github.com/docker/docker.git + remote.upstream.fetch=+refs/heads/*:refs/remotes/upstream/* To list just the remotes use: - - $ git remote -v - origin https://github.com/moxiegirl/docker.git (fetch) - origin https://github.com/moxiegirl/docker.git (push) - upstream https://github.com/docker/docker.git (fetch) - upstream https://github.com/docker/docker.git (push) - - - + + $ git remote -v + origin https://github.com/moxiegirl/docker.git (fetch) + origin https://github.com/moxiegirl/docker.git (push) + upstream https://github.com/docker/docker.git (fetch) + upstream https://github.com/docker/docker.git (push) + ## Create and push a branch -As you change code in your fork, you make your changes on a repository branch. The branch name should reflect what you are working on. In this section, you create a branch, make a change, and push it up to your fork. +As you change code in your fork, you make your changes on a repository branch. +The branch name should reflect what you are working on. In this section, you +create a branch, make a change, and push it up to your fork. -This branch is just for testing your config for this guide. The changes are part of a dry run so the branch name is going to be dry-run-test. To create an push the branch to your fork on GitHub: +This branch is just for testing your config for this guide. The changes arepart +of a dry run so the branch name is going to be dry-run-test. To create an push +the branch to your fork on GitHub: 1. Open a terminal and go to the root of your `docker-fork`. - $ cd docker-fork + $ cd docker-fork 2. Create a `dry-run-test` branch. - $ git checkout -b dry-run-test - - This command creates the branch and switches the repository to it. + $ git checkout -b dry-run-test + + This command creates the branch and switches the repository to it. 3. Verify you are in your new branch. - $ git branch - * dry-run-test - master - - The current branch has an * (asterisk) marker. So, these results shows you - are on the right branch. - + $ git branch + * dry-run-test + master + + The current branch has an * (asterisk) marker. So, these results shows you + are on the right branch. + 4. Create a `TEST.md` file in the repository's root. - $ touch TEST.md + $ touch TEST.md 5. Edit the file and add your email and location. - ![Add your information](/project/images/contributor-edit.png) - - You can use any text editor you are comfortable with. + ![Add your information](/project/images/contributor-edit.png) + + You can use any text editor you are comfortable with. 6. Close and save the file. 7. Check the status of your branch. - $ git status - On branch dry-run-test - Untracked files: - (use "git add ..." to include in what will be committed) + $ git status + On branch dry-run-test + Untracked files: + (use "git add ..." to include in what will be committed) + + TEST.md + + nothing added to commit but untracked files present (use "git add" to track) - TEST.md - - nothing added to commit but untracked files present (use "git add" to track) - You've only changed the one file. It is untracked so far by git. - + 8. Add your file. - $ git add TEST.md - - That is the only _staged_ file. Stage is fancy word for work that Git is - tracking. + $ git add TEST.md + + That is the only _staged_ file. Stage is fancy word for work that Git is + tracking. 9. Sign and commit your change. - $ git -s -m "Making a dry run test." - [dry-run-test 6e728fb] Making a dry run test - 1 file changed, 1 insertion(+) - create mode 100644 TEST.md + $ git -s -m "Making a dry run test." + [dry-run-test 6e728fb] Making a dry run test + 1 file changed, 1 insertion(+) + create mode 100644 TEST.md - - Commit messages should have a short summary sentence of no more than 50 - characters. Optionally, you can also include a more detailed explanation - after the summary. Separate the summary from any explanation with an empty - line. + Commit messages should have a short summary sentence of no more than 50 + characters. Optionally, you can also include a more detailed explanation + after the summary. Separate the summary from any explanation with an empty + line. 8. Push your changes to GitHub. - $ git push --set-upstream origin dry-run-test - Username for 'https://github.com': moxiegirl - Password for 'https://moxiegirl@github.com': - - Git prompts you for your GitHub username and password. Then, the command - returns a result. - - Counting objects: 13, done. - Compressing objects: 100% (2/2), done. - Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done. - Total 3 (delta 1), reused 0 (delta 0) - To https://github.com/moxiegirl/docker.git - * [new branch] dry-run-test -> dry-run-test - Branch dry-run-test set up to track remote branch dry-run-test from origin. - - + $ git push --set-upstream origin dry-run-test + Username for 'https://github.com': moxiegirl + Password for 'https://moxiegirl@github.com': + + Git prompts you for your GitHub username and password. Then, the command + returns a result. + + Counting objects: 13, done. + Compressing objects: 100% (2/2), done. + Writing objects: 100% (3/3), 320 bytes | 0 bytes/s, done. + Total 3 (delta 1), reused 0 (delta 0) + To https://github.com/moxiegirl/docker.git + * [new branch] dry-run-test -> dry-run-test + Branch dry-run-test set up to track remote branch dry-run-test from origin. + 9. Open your browser to Github. 10. Navigate to your Docker fork. 11. Make sure the `dry-run-test` branch exists, that it has your commit, and the commit is signed. - ![Branch Signature](/project/images/branch-sig.png) + ![Branch Signature](/project/images/branch-sig.png) - ## Where to go next -Congratulations, you have set up and validated the contributor requirements. In the next section you'll [learn how to set up and work in a Docker development container](/project/set-up-dev-env/). \ No newline at end of file +Congratulations, you have set up and validated the contributor requirements. +In the next section you'll [learn how to set up and work in a Docker development container](/project/set-up-dev-env/). diff --git a/docs/sources/project/test-and-docs.md b/docs/sources/project/test-and-docs.md index c1dedd9ba7..7e725d280c 100644 --- a/docs/sources/project/test-and-docs.md +++ b/docs/sources/project/test-and-docs.md @@ -2,6 +2,13 @@ page_title: Run tests and test documentation page_description: Describes Docker's testing infrastructure page_keywords: make test, make docs, Go tests, gofmt, contributing, running tests + + + # Run tests and test documentation Contributing includes testing your changes. If you change the Docker code, you @@ -9,9 +16,15 @@ may need to add a new test or modify an existing one. Your contribution could even be adding tests to Docker. For this reason, you need to know a little about Docker's test infrastructure. -Many contributors contribute documentation only. Or, a contributor makes a code contribution that changes how Docker behaves and that change needs documentation. For these reasons, you also need to know how to build, view, and test the Docker documentation. +Many contributors contribute documentation only. Or, a contributor makes a code +contribution that changes how Docker behaves and that change needs +documentation. For these reasons, you also need to know how to build, view, and +test the Docker documentation. -In this section, you run tests in the `dry-run-test` branch of your Docker fork. If you have followed along in this guide, you already have this branch. If you don't have this branch, you can create it or simply use another of your branches. +In this section, you run tests in the `dry-run-test` branch of your Docker +fork. If you have followed along in this guide, you already have this branch. +If you don't have this branch, you can create it or simply use another of your +branches. ## Understand testing at Docker @@ -23,51 +36,59 @@ href="http://golang.org/pkg/testing/" target="_blank">Go's testing package documentation and the go test help. -You are responsible for _unit testing_ your contribution when you add new or change existing Docker code. A unit test is a piece of code that invokes a single, small piece of code ( _unit of work_ ) to verify the unit works as expected. +You are responsible for _unit testing_ your contribution when you add new or +change existing Docker code. A unit test is a piece of code that invokes a +single, small piece of code ( _unit of work_ ) to verify the unit works as +expected. -Depending on your contribution, you may need to add _integration tests_. These are tests that combine two or more work units into one component. These work units each have unit tests and then, together, integration tests that test the interface between the components. The `integration` and `integration-cli` directories in the Docker repository contain integration test code. +Depending on your contribution, you may need to add _integration tests_. These +are tests that combine two or more work units into one component. These work +units each have unit tests and then, together, integration tests that test the +interface between the components. The `integration` and `integration-cli` +directories in the Docker repository contain integration test code. -Testing is its own speciality. If you aren't familiar with testing techniques, there is a lot of information available to you on the Web. For now, you should understand that, the Docker maintainers may ask you to write a new test or change an existing one. +Testing is its own speciality. If you aren't familiar with testing techniques, +there is a lot of information available to you on the Web. For now, you should +understand that, the Docker maintainers may ask you to write a new test or +change an existing one. ### Run tests on your local host -Before submitting any code change, you should run the entire Docker test suite. The `Makefile` contains a target for the entire test suite. The target's name is simply `test`. The make file contains several targets for testing: +Before submitting any code change, you should run the entire Docker test suite. +The `Makefile` contains a target for the entire test suite. The target's name +is simply `test`. The make file contains several targets for testing: - - + + - - + + - - + + - - + + - - + + - - + + - - + +
TargetWhat this target doesTargetWhat this target does
testRun all the tests.testRun all the tests.
test-unitRun just the unit tests.test-unitRun just the unit tests.
test-integrationRun just integration tests.test-integrationRun just integration tests.
test-integration-cliRun the test for the integration command line interface.test-integration-cliRun the test for the integration command line interface.
test-docker-pyRun the tests for Docker API client.test-docker-pyRun the tests for Docker API client.
docs-testRuns the documentation test build.docs-testRuns the documentation test build.
@@ -77,40 +98,44 @@ Run the entire test suite on your current repository: 2. Change to the root your Docker repository. - $ cd docker-fork + $ cd docker-fork 3. Make sure you are in your development branch. - $ git checkout dry-run-test + $ git checkout dry-run-test 4. Run the `make test` command. - $ make test - - This command does several things, it creates a container temporarily for testing. Inside that container, the `make`: - - * creates a new binary - * cross-compiles all the binaries for the various operating systems - * runs the all the tests in the system - - It can take several minutes to run all the tests. When they complete - successfully, you see the output concludes with something like this: - - - [PASSED]: top - sleep process should be listed in privileged mode - [PASSED]: version - verify that it works and that the output is properly formatted - PASS - coverage: 70.8% of statements - ---> Making bundle: test-docker-py (in bundles/1.5.0-dev/test-docker-py) - +++ exec docker --daemon --debug --host unix:///go/src/github.com/docker/docker/bundles/1.5.0-dev/test-docker-py/docker.sock --storage-driver vfs --exec-driver native --pidfile /go/src/github.com/docker/docker/bundles/1.5.0-dev/test-docker-py/docker.pid - ................................................................. - ---------------------------------------------------------------------- - Ran 65 tests in 89.266s - - + $ make test + + This command does several things, it creates a container temporarily for + testing. Inside that container, the `make`: + + * creates a new binary + * cross-compiles all the binaries for the various operating systems + * runs the all the tests in the system + + It can take several minutes to run all the tests. When they complete + successfully, you see the output concludes with something like this: + + + [PASSED]: top - sleep process should be listed in privileged mode + [PASSED]: version - verify that it works and that the output is properly formatted + PASS + coverage: 70.8% of statements + ---> Making bundle: test-docker-py (in bundles/1.5.0-dev/test-docker-py) + +++ exec docker --daemon --debug --host unix:///go/src/github.com/docker/docker/bundles/1.5.0-dev/test-docker-py/docker.sock --storage-driver vfs --exec-driver native --pidfile /go/src/github.com/docker/docker/bundles/1.5.0-dev/test-docker-py/docker.pid + ................................................................. + ---------------------------------------------------------------------- + Ran 65 tests in 89.266s + + ### Run test targets inside the development container -If you are working inside a Docker development container, you use the `project/make.sh` script to run tests. The `project/make.sh` script doesn't have a single target that runs all the tests. Instead, you provide a single commmand line with multiple targets that does the same thing. +If you are working inside a Docker development container, you use the +`project/make.sh` script to run tests. The `project/make.sh` script doesn't +have a single target that runs all the tests. Instead, you provide a single +commmand line with multiple targets that does the same thing. Try this now. @@ -118,38 +143,50 @@ Try this now. 2. Start a Docker development image. - If you are following along with this guide, you should have a `dry-run-test` image. + If you are following along with this guide, you should have a + `dry-run-test` image. - $ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/docker/docker dry-run-test /bin/bash + $ docker run --privileged --rm -ti -v `pwd`:/go/src/github.com/docker/docker dry-run-test /bin/bash 3. Run the tests using the `project/make.sh` script. - root@5f8630b873fe:/go/src/github.com/docker/docker# project/make.sh dynbinary binary cross test-unit test-integration test-integration-cli test-docker-py - - The tests run just as they did within your local host. - -Of course, you can also run a subset of these targets too. For example, to run just the unit tests: + root@5f8630b873fe:/go/src/github.com/docker/docker# project/make.sh dynbinary binary cross test-unit test-integration test-integration-cli test-docker-py - root@5f8630b873fe:/go/src/github.com/docker/docker# project/make.sh dynbinary binary cross test-unit + The tests run just as they did within your local host. -Most test targets require that you build these precursor targets first: `dynbinary binary cross` + +Of course, you can also run a subset of these targets too. For example, to run +just the unit tests: + + root@5f8630b873fe:/go/src/github.com/docker/docker# project/make.sh dynbinary binary cross test-unit + +Most test targets require that you build these precursor targets first: +`dynbinary binary cross` ## Running individual or multiple named tests -You can use the `TESTFLAGS` environment variable to run a single test. The flag's value is passed as arguments to the `go test` command. For example, from your local host you can run the `TestBuild` test with this command: +You can use the `TESTFLAGS` environment variable to run a single test. The +flag's value is passed as arguments to the `go test` command. For example, from +your local host you can run the `TestBuild` test with this command: + + $ TESTFLAGS='-test.run \^TestBuild\$' make test - $ TESTFLAGS='-test.run \^TestBuild\$' make test - To run the same test inside your Docker development container, you do this: - root@5f8630b873fe:/go/src/github.com/docker/docker# TESTFLAGS='-run ^TestBuild$' project/make.sh + root@5f8630b873fe:/go/src/github.com/docker/docker# TESTFLAGS='-run ^TestBuild$' project/make.sh ## If test under Boot2Docker fail do to space errors -Running the tests requires about 2GB of memory. If you are running your container on bare metal, that is you are not running with Boot2Docker, your Docker development container is able to take the memory it requires directly from your local host. +Running the tests requires about 2GB of memory. If you are running your +container on bare metal, that is you are not running with Boot2Docker, your +Docker development container is able to take the memory it requires directly +from your local host. -If you are running Docker using Boot2Docker, the VM uses 2048MB by default. This means you can exceed the memory of your VM running tests in a Boot2Docker environment. When the test suite runs out of memory, it returns errors similar to the following: +If you are running Docker using Boot2Docker, the VM uses 2048MB by default. +This means you can exceed the memory of your VM running tests in a Boot2Docker +environment. When the test suite runs out of memory, it returns errors similar +to the following: server.go:1302 Error: Insertion failed because database is full: database or disk is full @@ -157,43 +194,44 @@ If you are running Docker using Boot2Docker, the VM uses 2048MB by default. This utils_test.go:179: Error copy: exit status 1 (cp: writing '/tmp/docker-testd5c9-[...]': No space left on device -To increase the memory on your VM, you need to reinitialize the Boot2Docker VM with new memory settings. +To increase the memory on your VM, you need to reinitialize the Boot2Docker VM +with new memory settings. 1. Stop all running containers. 2. View the current memory setting. - $ boot2docker info - { - "Name": "boot2docker-vm", - "UUID": "491736fd-4075-4be7-a6f5-1d4cdcf2cc74", - "Iso": "/Users/mary/.boot2docker/boot2docker.iso", - "State": "running", - "CPUs": 8, - "Memory": 2048, - "VRAM": 8, - "CfgFile": "/Users/mary/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vbox", - "BaseFolder": "/Users/mary/VirtualBox VMs/boot2docker-vm", - "OSType": "", - "Flag": 0, - "BootOrder": null, - "DockerPort": 0, - "SSHPort": 2022, - "SerialFile": "/Users/mary/.boot2docker/boot2docker-vm.sock" - } + $ boot2docker info + { + "Name": "boot2docker-vm", + "UUID": "491736fd-4075-4be7-a6f5-1d4cdcf2cc74", + "Iso": "/Users/mary/.boot2docker/boot2docker.iso", + "State": "running", + "CPUs": 8, + "Memory": 2048, + "VRAM": 8, + "CfgFile": "/Users/mary/VirtualBox VMs/boot2docker-vm/boot2docker-vm.vbox", + "BaseFolder": "/Users/mary/VirtualBox VMs/boot2docker-vm", + "OSType": "", + "Flag": 0, + "BootOrder": null, + "DockerPort": 0, + "SSHPort": 2022, + "SerialFile": "/Users/mary/.boot2docker/boot2docker-vm.sock" + } 3. Delete your existing `boot2docker` profile. - $ boot2docker delete + $ boot2docker delete 4. Reinitialize `boot2docker` and specify a higher memory. - $ boot2docker init -m 5555 + $ boot2docker init -m 5555 5. Verify the memory was reset. - $ boot2docker info + $ boot2docker info 6. Restart your container and try your test again. @@ -206,43 +244,49 @@ href="http://www.mkdocs.org/" target="_blank">MkDocs to build Docker's documentation. Of course, you don't need to install this generator to build the documentation, it is included with container. -You should always check your documentation for grammar and spelling. The best way to do this is with an online grammar checker. +You should always check your documentation for grammar and spelling. The best +way to do this is with an online grammar checker. -When you change a documentation source file, you should test your change locally to make sure your content is there and any links work correctly. You can build the documentation from the local host. The build starts a container and loads the documentation into a server. As long as this container runs, you can browse the docs. +When you change a documentation source file, you should test your change +locally to make sure your content is there and any links work correctly. You +can build the documentation from the local host. The build starts a container +and loads the documentation into a server. As long as this container runs, you +can browse the docs. 1. In a terminal, change to the root of your `docker-fork` repository. - $ cd ~/repos/dry-run-test + $ cd ~/repos/dry-run-test 2. Make sure you are in your feature branch. - $ git status - On branch dry-run-test - Your branch is up-to-date with 'origin/dry-run-test'. - nothing to commit, working directory clean - + $ git status + On branch dry-run-test + Your branch is up-to-date with 'origin/dry-run-test'. + nothing to commit, working directory clean + 3. Build the documentation. - $ make docs - - When the build completes, you'll see a final output message similar to the - following: - - Successfully built ee7fe7553123 - docker run --rm -it -e AWS_S3_BUCKET -e NOCACHE -p 8000:8000 "docker-docs:dry-run-test" mkdocs serve - Running at: http://0.0.0.0:8000/ - Live reload enabled. - Hold ctrl+c to quit. - + $ make docs + + When the build completes, you'll see a final output message similar to the + following: + + Successfully built ee7fe7553123 + docker run --rm -it -e AWS_S3_BUCKET -e NOCACHE -p 8000:8000 "docker-docs:dry-run-test" mkdocs serve + Running at: http://0.0.0.0:8000/ + Live reload enabled. + Hold ctrl+c to quit. + 4. Enter the URL in your browser. - If you are running Boot2Docker, replace the default localhost address - (0.0.0.0) with your DOCKERHOST value. You can get this value at any time by - entering `boot2docker ip` at the command line. - + If you are running Boot2Docker, replace the default localhost address + (0.0.0.0) with your DOCKERHOST value. You can get this value at any time by + entering `boot2docker ip` at the command line. + 5. Once in the documentation, look for the red notice to verify you are seeing the correct build. - ![Beta documentation](/project/images/red_notice.png) + ![Beta documentation](/project/images/red_notice.png) 6. Navigate to your new or changed document. @@ -253,10 +297,7 @@ When you change a documentation source file, you should test your change locally ## Where to go next -Congratulations, you have successfully completed the basics you need to understand the Docker test framework. In the next steps, you use what you have learned so far to [contribute to Docker by working on an issue](/project/make-a-contribution/). - - - - - - +Congratulations, you have successfully completed the basics you need to +understand the Docker test framework. In the next steps, you use what you have +learned so far to [contribute to Docker by working on an +issue](/project/make-a-contribution/). diff --git a/docs/sources/project/who-written-for.md b/docs/sources/project/who-written-for.md index c2929fe467..4c290a1673 100644 --- a/docs/sources/project/who-written-for.md +++ b/docs/sources/project/who-written-for.md @@ -6,17 +6,31 @@ page_keywords: Gordon, introduction, turtle, machine, libcontainer, how to This section of the documentation contains a guide for Docker users who want to contribute code or documentation to the Docker project. As a community, we -share rules of behavior and interaction. Make sure you are familiar with the community guidelines before continuing. +share rules of behavior and interaction. Make sure you are familiar with the community guidelines before continuing. ## Where and what you can contribute -The Docker project consists of not just one but several repositories on GitHub. So, in addition to the `docker/docker` repository, there is the `docker/libcontainer` repo, the `docker/machine` repo, and several more. Contribute to any of these and you contribute to the Docker project. +The Docker project consists of not just one but several repositories on GitHub. +So, in addition to the `docker/docker` repository, there is the +`docker/libcontainer` repo, the `docker/machine` repo, and several more. +Contribute to any of these and you contribute to the Docker project. -Not all Docker repositories use the Go language. Also, each repository has its own focus area. So, if you are an experienced contributor, think about contributing to a Docker repository that has a language or a focus area you are familiar with. +Not all Docker repositories use the Go language. Also, each repository has its +own focus area. So, if you are an experienced contributor, think about +contributing to a Docker repository that has a language or a focus area you are +familiar with. -If you are new to the open source community, to Docker, or to formal programming, you should start out contributing to the `docker/docker` repository. Why? Because this guide is written for that repository specifically. +If you are new to the open source community, to Docker, or to formal +programming, you should start out contributing to the `docker/docker` +repository. Why? Because this guide is written for that repository specifically. -Finally, code or documentation isn't the only way to contribute. You can report an issue, add to discussions in our community channel, write a blog post, or take a usability test. You can even propose your own type of contribution. Right now we don't have a lot written about this yet, so just email if this type of contributing interests you. +Finally, code or documentation isn't the only way to contribute. You can report +an issue, add to discussions in our community channel, write a blog post, or +take a usability test. You can even propose your own type of contribution. +Right now we don't have a lot written about this yet, so just email + if this type of contributing interests you. ## A turtle is involved @@ -26,12 +40,18 @@ Enough said. ## How to use this guide -This is written for the distracted, the overworked, the sloppy reader with fair `git` skills and a failing memory for the GitHub GUI. The guide attempts to explain how to use the Docker environment as precisely, predictably, and procedurally as possible. +This is written for the distracted, the overworked, the sloppy reader with fair +`git` skills and a failing memory for the GitHub GUI. The guide attempts to +explain how to use the Docker environment as precisely, predictably, and +procedurally as possible. -Users who are new to the Docker development environment should start by setting up their environment. Then, they should try a simple code change. After that, you should find something to work on or propose at totally new change. +Users who are new to the Docker development environment should start by setting +up their environment. Then, they should try a simple code change. After that, +you should find something to work on or propose at totally new change. -If you are a programming prodigy, you still may find this documentation useful. Please feel free to skim past information you find obvious or boring. +If you are a programming prodigy, you still may find this documentation useful. +Please feel free to skim past information you find obvious or boring. ## How to get started -Start by [setting up the prerequisites for contributing](/project/set-up-prereqs/). \ No newline at end of file +Start by [setting up the prerequisites for contributing](/project/set-up-prereqs/).