add Scott's link checker script, and fix what it finds

Signed-off-by: Sven Dowideit <SvenDowideit@home.org.au>
This commit is contained in:
Sven Dowideit 2014-12-16 14:25:37 +10:00
parent 4e7fb6b1f0
commit fbb9223b1a
39 changed files with 150 additions and 57 deletions

View File

@ -55,6 +55,9 @@ docs-shell: docs-build
docs-release: docs-build
$(DOCKER_RUN_DOCS) -e OPTIONS -e BUILD_ROOT "$(DOCKER_DOCS_IMAGE)" ./release.sh
docs-test: docs-build
$(DOCKER_RUN_DOCS) "$(DOCKER_DOCS_IMAGE)" ./test.sh
test: build
$(DOCKER_RUN_DOCKER) hack/make.sh binary cross test-unit test-integration test-integration-cli

View File

@ -33,6 +33,11 @@ In the root of the `docker` source directory:
If you have any issues you need to debug, you can use `make docs-shell` and then
run `mkdocs serve`
## Testing the links
You can use `make docs-test` to generate a report of missing links that are referenced in
the documentation - there should be none.
## Adding a new document
New document (`.md`) files are added to the documentation builds by adding them

79
docs/docvalidate.py Executable file
View File

@ -0,0 +1,79 @@
#!/usr/bin/env python
""" I honestly don't even know how the hell this works, just use it. """
__author__ = "Scott Stamp <scott@hypermine.com>"
from HTMLParser import HTMLParser
from urlparse import urljoin
from sys import setrecursionlimit
import re
import requests
setrecursionlimit(10000)
root = 'http://localhost:8000'
class DataHolder:
def __init__(self, value=None, attr_name='value'):
self._attr_name = attr_name
self.set(value)
def __call__(self, value):
return self.set(value)
def set(self, value):
setattr(self, self._attr_name, value)
return value
def get(self):
return getattr(self, self._attr_name)
class Parser(HTMLParser):
global root
ids = set()
crawled = set()
anchors = {}
pages = set()
save_match = DataHolder(attr_name='match')
def __init__(self, origin):
self.origin = origin
HTMLParser.__init__(self)
def handle_starttag(self, tag, attrs):
attrs = dict(attrs)
if 'href' in attrs:
href = attrs['href']
if re.match('^{0}|\/|\#[\S]{{1,}}'.format(root), href):
if self.save_match(re.search('.*\#(.*?)$', href)):
if self.origin not in self.anchors:
self.anchors[self.origin] = set()
self.anchors[self.origin].add(
self.save_match.match.groups(1)[0])
url = urljoin(root, href)
if url not in self.crawled and not re.match('^\#', href):
self.crawled.add(url)
Parser(url).feed(requests.get(url).content)
if 'id' in attrs:
self.ids.add(attrs['id'])
# explicit <a name=""></a> references
if 'name' in attrs:
self.ids.add(attrs['name'])
r = requests.get(root)
parser = Parser(root)
parser.feed(r.content)
for anchor in sorted(parser.anchors):
if not re.match('.*/\#.*', anchor):
for anchor_name in parser.anchors[anchor]:
if anchor_name not in parser.ids:
print 'Missing - ({0}): #{1}'.format(
anchor.replace(root, ''), anchor_name)

View File

@ -5,7 +5,7 @@ page_keywords: Examples, Usage, base image, docker, documentation, examples
# Create a Base Image
So you want to create your own [*Base Image*](
/terms/image/#base-image-def)? Great!
/terms/image/#base-image)? Great!
The specific process will depend heavily on the Linux distribution you
want to package. We have some examples below, and you are encouraged to

View File

@ -17,7 +17,7 @@ If you get `docker: command not found` or something like
incomplete Docker installation or insufficient privileges to access
Docker on your machine.
Please refer to [*Installation*](/installation/#installation-list)
Please refer to [*Installation*](/installation)
for installation instructions.
## Download a pre-built image
@ -26,7 +26,7 @@ for installation instructions.
$ sudo docker pull ubuntu
This will find the `ubuntu` image by name on
[*Docker Hub*](/userguide/dockerrepos/#find-public-images-on-docker-hub)
[*Docker Hub*](/userguide/dockerrepos/#searching-for-images)
and download it from [Docker Hub](https://hub.docker.com) to a local
image cache.
@ -174,6 +174,6 @@ will be stored (as a diff). See which images you already have using the
You now have an image state from which you can create new instances.
Read more about [*Share Images via
Repositories*](/userguide/dockerrepos/#working-with-the-repository) or
Repositories*](/userguide/dockerrepos) or
continue to the complete [*Command
Line*](/reference/commandline/cli/#cli)
Line*](/reference/commandline/cli)

View File

@ -7,7 +7,7 @@ page_keywords: chef, installation, usage, docker, documentation
> **Note**:
> Please note this is a community contributed installation path. The only
> `official` installation is using the
> [*Ubuntu*](/installation/ubuntulinux/#ubuntu-linux) installation
> [*Ubuntu*](/installation/ubuntulinux) installation
> path. This version may sometimes be out of date.
## Requirements

View File

@ -6,7 +6,7 @@ page_keywords: puppet, installation, usage, docker, documentation
> *Note:* Please note this is a community contributed installation path. The
> only `official` installation is using the
> [*Ubuntu*](/installation/ubuntulinux/#ubuntu-linux) installation
> [*Ubuntu*](/installation/ubuntulinux) installation
> path. This version may sometimes be out of date.
## Requirements

View File

@ -33,7 +33,7 @@ of another container. Of course, if the host system is setup
accordingly, containers can interact with each other through their
respective network interfaces — just like they can interact with
external hosts. When you specify public ports for your containers or use
[*links*](/userguide/dockerlinks/#working-with-links-names)
[*links*](/userguide/dockerlinks)
then IP traffic is allowed between containers. They can ping each other,
send/receive UDP packets, and establish TCP connections, but that can be
restricted if necessary. From a network architecture point of view, all

View File

@ -6,7 +6,7 @@ page_keywords: docker, supervisor, process management
> **Note**:
> - **If you don't like sudo** then see [*Giving non-root
> access*](/installation/binaries/#dockergroup)
> access*](/installation/binaries/#giving-non-root-access)
Traditionally a Docker container runs a single process when it is
launched, for example an Apache daemon or a SSH server daemon. Often

View File

@ -6,7 +6,7 @@ page_keywords: docker, example, package installation, networking, debian, ubuntu
> **Note**:
> - **If you don't like sudo** then see [*Giving non-root
> access*](/installation/binaries/#dockergroup).
> access*](/installation/binaries/#giving-non-root-access).
> - **If you're using OS X or docker via TCP** then you shouldn't use
> sudo.

View File

@ -6,7 +6,7 @@ page_keywords: docker, example, package installation, networking, couchdb, data
> **Note**:
> - **If you don't like sudo** then see [*Giving non-root
> access*](/installation/binaries/#dockergroup)
> access*](/installation/binaries/#giving-non-root-access)
Here's an example of using data volumes to share the same data between
two CouchDB containers. This could be used for hot upgrades, testing

View File

@ -6,7 +6,7 @@ page_keywords: docker, example, package installation, node, centos
> **Note**:
> - **If you don't like sudo** then see [*Giving non-root
> access*](/installation/binaries/#dockergroup)
> access*](/installation/binaries/#giving-non-root-access)
The goal of this example is to show you how you can build your own
Docker images from a parent image using a `Dockerfile`

View File

@ -6,7 +6,7 @@ page_keywords: docker, example, package installation, postgresql
> **Note**:
> - **If you don't like sudo** then see [*Giving non-root
> access*](/installation/binaries/#dockergroup)
> access*](/installation/binaries/#giving-non-root-access)
## Installing PostgreSQL on Docker

View File

@ -42,7 +42,7 @@
[`POST /containers/(id)/stop`](../reference/api/docker_remote_api_v1.9/#post--containers-(id)-stop) **
[`GET /containers/(id)/top`](../reference/api/docker_remote_api_v1.9/#get--containers-(id)-top) **
[`POST /containers/(id)/wait`](../reference/api/docker_remote_api_v1.9/#post--containers-(id)-wait) **
[`POST /containers/create`](../reference/api/docker_remote_api_v1.9/#post--containers-create) **
[`POST /containers/create`](/reference/api/docker_remote_api_v1.9/#create-a-container) **
[`GET /containers/json`](../reference/api/docker_remote_api_v1.9/#get--containers-json) **
[`POST /containers/(id)/resize`](../reference/api/docker_remote_api_v1.9/#get--containers-resize) **
 

View File

@ -40,10 +40,10 @@ over to the [User Guide](/userguide).
## Standard Ubuntu Installation
If you want a more hands-on installation, then you can follow the
[*Ubuntu*](../ubuntulinux/#ubuntu-linux) instructions installing Docker
on any EC2 instance running Ubuntu. Just follow Step 1 from [*Amazon
QuickStart*](#amazon-quickstart) to pick an image (or use one of your
[*Ubuntu*](/installation/ubuntulinux) instructions installing Docker
on any EC2 instance running Ubuntu. Just follow Step 1 from the Amazon
QuickStart above to pick an image (or use one of your
own) and skip the step with the *User Data*. Then continue with the
[*Ubuntu*](../ubuntulinux/#ubuntu-linux) instructions.
[*Ubuntu*](/installation/ubuntulinux) instructions.
Continue with the [User Guide](/userguide/).

View File

@ -77,7 +77,7 @@ need to add `sudo` to all the client commands.
> **Warning**:
> The *docker* group (or the group specified with `-G`) is root-equivalent;
> see [*Docker Daemon Attack Surface*](
> /articles/security/#dockersecurity-daemon) details.
> /articles/security/#docker-daemon-attack-surface) details.
## Upgrades

View File

@ -240,7 +240,7 @@ alternative group.
> **Warning**:
> The `docker` group (or the group specified with the `-G` flag) is
> `root`-equivalent; see [*Docker Daemon Attack Surface*](
> /articles/security/#dockersecurity-daemon) for details.
> /articles/security/#docker-daemon-attack-surface) for details.
**Example:**

View File

@ -366,7 +366,7 @@ output is now generated in the client, using the
You can now split stderr from stdout. This is done by
prefixing a header to each transmission. See
[`POST /containers/(id)/attach`](
/reference/api/docker_remote_api_v1.9/#post--containers-(id)-attach "POST /containers/(id)/attach").
/reference/api/docker_remote_api_v1.9/#attach-to-a-container "POST /containers/(id)/attach").
The WebSocket attach is unchanged. Note that attach calls on the
previous API version didn't change. Stdout and stderr are merged.

View File

@ -499,7 +499,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.
@ -998,7 +998,7 @@ Build an image from Dockerfile via stdin
The archive must include a file called `Dockerfile`
at its root. It may include any number of other files,
which will be accessible in the build context (See the [*ADD build
command*](/reference/builder/#dockerbuilder)).
command*](/reference/builder/#add)).
Query Parameters:

View File

@ -535,7 +535,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -583,7 +583,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -576,7 +576,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -581,7 +581,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -721,7 +721,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -669,7 +669,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](../docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -525,7 +525,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](/api/docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -470,7 +470,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](/api/docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.7/#create-a-container),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -518,7 +518,7 @@ Status Codes:
When using the TTY setting is enabled in
[`POST /containers/create`
](/api/docker_remote_api_v1.9/#post--containers-create "POST /containers/create"),
](/reference/api/docker_remote_api_v1.9/#create-a-container "POST /containers/create"),
the stream is the raw data from the process PTY and client's stdin.
When the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.

View File

@ -522,7 +522,7 @@ Status Codes:
**Stream details**:
When using the TTY setting is enabled in
[`POST /containers/create`](#post--containers-create), the
[`POST /containers/create`](#create-a-container), the
stream is the raw data from the process PTY and client's stdin. When
the TTY is disabled, then the stream is multiplexed to separate
stdout and stderr.
@ -1004,7 +1004,7 @@ Build an image from Dockerfile using a POST body.
The archive must include a file called `Dockerfile`
at its root. It may include any number of other files,
which will be accessible in the build context (See the [*ADD build
command*](/reference/builder/#dockerbuilder)).
command*](/reference/builder/#add)).
Query Parameters:

View File

@ -79,7 +79,7 @@ guide](/articles/dockerfile_best-practices/#build-cache) for more information):
Successfully built 1a5ffc17324d
When you're done with your build, you're ready to look into [*Pushing a
repository to its registry*]( /userguide/dockerrepos/#image-push).
repository to its registry*]( /userguide/dockerrepos/#contributing-to-docker-hub).
## Format
@ -93,7 +93,7 @@ be UPPERCASE in order to distinguish them from arguments more easily.
Docker runs the instructions in a `Dockerfile` in order. **The
first instruction must be \`FROM\`** in order to specify the [*Base
Image*](/terms/image/#base-image-def) from which you are building.
Image*](/terms/image/#base-image) from which you are building.
Docker will treat lines that *begin* with `#` as a
comment. A `#` marker anywhere else in the line will
@ -186,11 +186,11 @@ Or
FROM <image>:<tag>
The `FROM` instruction sets the [*Base Image*](/terms/image/#base-image-def)
The `FROM` instruction sets the [*Base Image*](/terms/image/#base-image)
for subsequent instructions. As such, a valid `Dockerfile` must have `FROM` as
its first instruction. The image can be any valid image it is especially easy
to start by **pulling an image** from the [*Public Repositories*](
/userguide/dockerrepos/#using-public-repositories).
/userguide/dockerrepos).
`FROM` must be the first non-comment instruction in the `Dockerfile`.
@ -763,7 +763,7 @@ and mark it as holding externally mounted volumes from native host or other
containers. The value can be a JSON array, `VOLUME ["/var/log/"]`, or a plain
string with multiple arguments, such as `VOLUME /var/log` or `VOLUME /var/log
/var/db`. For more information/examples and mounting instructions via the
Docker client, refer to [*Share Directories via Volumes*](/userguide/dockervolumes/#volume-def)
Docker client, refer to [*Share Directories via Volumes*](/userguide/dockervolumes/#volume)
documentation.
> **Note**:

View File

@ -459,7 +459,7 @@ Use this command to build Docker images from a Dockerfile and a
The files at `PATH` or `URL` are called the "context" of the build. The
build process may refer to any of the files in the context, for example
when using an [*ADD*](/reference/builder/#dockerfile-add) instruction.
when using an [*ADD*](/reference/builder/#add) instruction.
When a single Dockerfile is given as `URL` or is piped through `STDIN`
(`docker build - < Dockerfile`), then no context is set.
@ -539,7 +539,7 @@ machine and that no parsing of the Dockerfile
happens at the client side (where you're running
`docker build`). That means that *all* the files at
`PATH` get sent, not just the ones listed to
[*ADD*](/reference/builder/#dockerfile-add) in the Dockerfile.
[*ADD*](/reference/builder/#add) in the Dockerfile.
The transfer of context from the local machine to the Docker daemon is
what the `docker` client means when you see the
@ -1814,7 +1814,7 @@ Search [Docker Hub](https://hub.docker.com) for images
-s, --stars=0 Only displays with at least x stars
See [*Find Public Images on Docker Hub*](
/userguide/dockerrepos/#find-public-images-on-docker-hub) for
/userguide/dockerrepos/#searching-for-images) for
more details on finding shared images from the command line.
## start
@ -1850,7 +1850,7 @@ grace period, `SIGKILL`.
You can group your images together using names and tags, and then upload
them to [*Share Images via Repositories*](
/userguide/dockerrepos/#working-with-the-repository).
/userguide/dockerrepos/#contributing-to-docker-hub).
## top

View File

@ -7,7 +7,7 @@ page_keywords: docker, run, configure, runtime
**Docker runs processes in isolated containers**. When an operator
executes `docker run`, she starts a process with its own file system,
its own networking, and its own isolated process tree. The
[*Image*](/terms/image/#image-def) which starts the process may define
[*Image*](/terms/image/#image) which starts the process may define
defaults related to the binary to run, the networking to expose, and
more, but `docker run` gives final control to the operator who starts
the container from the image. That's the main reason
@ -114,7 +114,7 @@ The UUID identifiers come from the Docker daemon, and if you do not
assign a name to the container with `--name` then the daemon will also
generate a random string name too. The name can become a handy way to
add meaning to a container since you can use this name when defining
[*links*](/userguide/dockerlinks/#working-with-links-names) (or any
[*links*](/userguide/dockerlinks) (or any
other place you need to identify a container). This works for both
background and foreground Docker containers.
@ -420,7 +420,7 @@ familiar with using LXC directly.
## Overriding Dockerfile image defaults
When a developer builds an image from a [*Dockerfile*](/reference/builder/#dockerbuilder)
When a developer builds an image from a [*Dockerfile*](/reference/builder)
or when she commits it, the developer can set a number of default parameters
that take effect when the image starts up as a container.
@ -634,7 +634,7 @@ container's `/etc/hosts` entry will be automatically updated.
The volumes commands are complex enough to have their own documentation
in section [*Managing data in
containers*](/userguide/dockervolumes/#volume-def). A developer can define
containers*](/userguide/dockervolumes). A developer can define
one or more `VOLUME`'s associated with an image, but only the operator
can give access from one container to another (or from a container to a
volume mounted on the host).

View File

@ -8,10 +8,10 @@ page_keywords: containers, lxc, concepts, explanation, image, container
![](/terms/images/docker-filesystems-debian.png)
In Docker terminology, a read-only [*Layer*](/terms/layer/#layer-def) is
In Docker terminology, a read-only [*Layer*](/terms/layer/#layer) is
called an **image**. An image never changes.
Since Docker uses a [*Union File System*](/terms/layer/#ufs-def), the
Since Docker uses a [*Union File System*](/terms/layer/#union-file-system), the
processes think the whole file system is mounted read-write. But all the
changes go to the top-most writeable layer, and underneath, the original
file in the read-only image is unchanged. Since images don't change,

View File

@ -7,7 +7,7 @@ page_keywords: containers, lxc, concepts, explanation, image, container
## Introduction
In a traditional Linux boot, the kernel first mounts the root [*File
System*](/terms/filesystem/#filesystem-def) as read-only, checks its
System*](/terms/filesystem) as read-only, checks its
integrity, and then switches the whole rootfs volume to read-write mode.
## Layer

View File

@ -36,8 +36,8 @@ e-mail address. It will then automatically log you in. You can now commit and
push your own images up to your repos on Docker Hub.
> **Note:**
> Your authentication credentials will be stored in the [`.dockercfg`
> authentication file](#authentication-file) in your home directory.
> Your authentication credentials will be stored in the `.dockercfg`
> authentication file in your home directory.
## Searching for images

View File

@ -21,7 +21,7 @@ Docker.
A *data volume* is a specially-designated directory within one or more
containers that bypasses the [*Union File
System*](/terms/layer/#ufs-def) to provide several useful features for
System*](/terms/layer/#union-file-system) to provide several useful features for
persistent or shared data:
- Data volumes can be shared and reused between containers

View File

@ -29,7 +29,7 @@ page_keywords: documentation, docs, the docker guide, docker guide, docker, dock
<p>
<div class="alert alert-success" id="all_good" style="display:none;">Congratulations, you made no mistake!<br />
Tell the world <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.docker.io/learn/dockerfile/level1/" data-text="I just successfully answered questions of the #Dockerfile tutorial Level 1. What's your score?" data-via="docker" >Tweet</a><br />
And try the next challenge: <a href="#fill_the_dockerfile">Fill the Dockerfile</a>
And try the next challenge: <a href="#fill-the-dockerfile">Fill the Dockerfile</a>
</div>
<div class="alert alert-error" id="no_good" style="display:none;">Your Dockerfile skills are not yet perfect, try to take the time to read this tutorial again.</div>
<div class="alert alert-block" id="some_good" style="display:none;">You're almost there! Read carefully the sections corresponding to your errors, and take the test again!</div>
@ -69,4 +69,4 @@ Tell the world! <a href="https://twitter.com/share" class="twitter-share-button"
which user to use, and how expose a particular port.</p>
<a title="back" class="btn btn-primary back" href="/userguide/dockerimages/#creating-our-own-images">Back</a>
<a title="next level" class="btn btn-primary" href="/userguide/level2">Go to the next level</a>
<a title="next level" class="btn btn-primary" href="/userguide/level2">Go to the next level</a>

View File

@ -39,7 +39,7 @@ What is the Dockerfile instruction to specify the base image?<br>
<div class="alert alert-success" id="all_good" style="display:none;">Congratulations, you made no mistake!<br />
Tell the world <a href="https://twitter.com/share" class="twitter-share-button" data-url="http://www.docker.io/learn/dockerfile/level1/" data-text="I just successfully answered questions of the #Dockerfile tutorial Level 1. What's your score?" data-via="docker" >Tweet</a><br />
And try the next challenge: <a href="#fill_the_dockerfile">Fill the Dockerfile</a>
And try the next challenge: <a href="#fill-the-dockerfile">Fill the Dockerfile</a>
</div>
<div class="alert alert-error" id="no_good" style="display:none;">Your Dockerfile skills are not yet perfect, try to take the time to read this tutorial again.</div>
<div class="alert alert-block" id="some_good" style="display:none;">You're almost there! Read carefully the sections corresponding to your errors, and take the test again!</div>
@ -93,4 +93,4 @@ Thanks for going through our tutorial! We will be posting Level 3 in the future.
To improve your Dockerfile writing skills even further, visit the <a href="https://docs.docker.com/articles/dockerfile_best-practices/">Dockerfile best practices page</a>.
<a title="creating our own images" class="btn btn-primary" href="/userguide/dockerimages/#creating-our-own-images">Back to the Docs!</a>
<a title="creating our own images" class="btn btn-primary" href="/userguide/dockerimages/#creating-our-own-images">Back to the Docs!</a>

6
docs/test.sh Executable file
View File

@ -0,0 +1,6 @@
#!/bin/sh
mkdocs serve &
echo "Waiting for 5 seconds to allow mkdocs server to be ready"
sleep 5
./docvalidate.py