migrate to hugo

Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
This commit is contained in:
David Karlsson 2023-05-23 10:07:11 +02:00 committed by David Karlsson
parent 4bbeb2093f
commit a0d21ade2f
2288 changed files with 251055 additions and 37881 deletions

View File

@ -1,3 +0,0 @@
FROM docker/dev-environments-ruby:stable-1
RUN gem install bundler jekyll
CMD ["bundle", "install"]

View File

@ -1,3 +0,0 @@
{
"dockerfile": "Dockerfile.devenv"
}

View File

@ -2,13 +2,12 @@
.github .github
.gitignore .gitignore
.idea .idea
.jekyll-cache
.jekyll-metadata
.sass-cache
tests
_releaser _releaser
_site
CONTRIBUTING.md CONTRIBUTING.md
Dockerfile Dockerfile
docker-compose.yml compose.yml
/vendor docker-bake.hcl
public
node_modules
resources
tmp

View File

@ -1,5 +0,0 @@
root = true
[*.{scss,html,md}]
indent_style = space
indent_size = 2

2
.env
View File

@ -1,2 +0,0 @@
COMPOSE_DOCKER_CLI_BUILD=1
DOCKER_BUILDKIT=1

View File

@ -24,10 +24,13 @@ jobs:
name: Build name: Build
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
files: |
docker-bake.hcl
targets: release targets: release
set: | set: |
*.cache-from=type=gha,scope=build *.cache-from=type=gha,scope=build
*.cache-to=type=gha,scope=build,mode=max *.cache-to=type=gha,scope=build,mode=max
*.args.HUGO_ENV=production
validate: validate:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
@ -35,8 +38,8 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
target: target:
- htmltest - lint
- mdl - test
steps: steps:
- -
name: Checkout name: Checkout
@ -48,56 +51,13 @@ jobs:
name: Validate name: Validate
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
targets: ${{ matrix.target }}-output files: |
docker-bake.hcl
targets: ${{ matrix.target }}
set: | set: |
*.cache-to=type=gha,scope=validate-${{ matrix.target }},mode=max *.cache-to=type=gha,scope=validate-${{ matrix.target }},mode=max
*.cache-from=type=gha,scope=validate-${{ matrix.target }} *.cache-from=type=gha,scope=validate-${{ matrix.target }}
*.cache-from=type=gha,scope=build *.cache-from=type=gha,scope=build
-
name: Annotate
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const results = fs.readFileSync('lint/results', 'utf-8');
if (results.length == 0) {
process.exit(0);
}
// print results
console.log(results);
process.exitCode = 1;
// construct annotations by parsing output
switch ("${{ matrix.target }}") {
case "htmltest":
const re = /^- (.+)\n \* (.+) \(line (\d+)\)\n(.+)$/gm;
while (true) {
const result = re.exec(results);
if (result === null) {
break;
}
core.error(`${result[2]}\n${result[4]}`, {
title: 'HTML test failed',
// file: result[1],
// startLine: result[3],
});
}
break;
case "mdl":
const jsonResults = JSON.parse(results);
for (const result of jsonResults) {
const title = result.rule + (result.aliases.length > 0 ? ` (${result.aliases[0]})` : ``);
console.log(`${result.filename}:${result.line}; ${title} - ${result.description}`);
core.error(result.description, {
title: title,
file: result.filename,
startLine: result.line,
});
}
break;
}
# build-releaser job will just build _releaser app used for Netlify and # build-releaser job will just build _releaser app used for Netlify and
# AWS deployment in publish workflow. it's just to be sure it builds correctly. # AWS deployment in publish workflow. it's just to be sure it builds correctly.
@ -114,6 +74,8 @@ jobs:
name: Build name: Build
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
files: |
docker-bake.hcl
targets: releaser-build targets: releaser-build
set: | set: |
*.cache-from=type=gha,scope=releaser *.cache-from=type=gha,scope=releaser

View File

@ -21,9 +21,10 @@ jobs:
- -
name: Prepare name: Prepare
run: | run: |
JEKYLL_ENV=development HUGO_ENV=development
DOCS_AWS_REGION=us-east-1 DOCS_AWS_REGION=us-east-1
if [ "${{ github.ref }}" = "refs/heads/main" ]; then if [ "${{ github.ref }}" = "refs/heads/main" ]; then
HUGO_ENV=staging
DOCS_URL="https://docs-stage.docker.com" DOCS_URL="https://docs-stage.docker.com"
DOCS_AWS_IAM_ROLE="arn:aws:iam::710015040892:role/stage-docs-docs.docker.com-20220818202135984800000001" DOCS_AWS_IAM_ROLE="arn:aws:iam::710015040892:role/stage-docs-docs.docker.com-20220818202135984800000001"
DOCS_S3_BUCKET="stage-docs-docs.docker.com" DOCS_S3_BUCKET="stage-docs-docs.docker.com"
@ -32,7 +33,7 @@ jobs:
DOCS_LAMBDA_FUNCTION_REDIRECTS="DockerDocsRedirectFunction-stage" DOCS_LAMBDA_FUNCTION_REDIRECTS="DockerDocsRedirectFunction-stage"
DOCS_SLACK_MSG="Successfully deployed docs-stage from main branch. $DOCS_URL" DOCS_SLACK_MSG="Successfully deployed docs-stage from main branch. $DOCS_URL"
elif [ "${{ github.ref }}" = "refs/heads/published" ]; then elif [ "${{ github.ref }}" = "refs/heads/published" ]; then
JEKYLL_ENV=production HUGO_ENV=production
DOCS_URL="https://docs.docker.com" DOCS_URL="https://docs.docker.com"
DOCS_AWS_IAM_ROLE="arn:aws:iam::710015040892:role/prod-docs-docs.docker.com-20220818202218674300000001" DOCS_AWS_IAM_ROLE="arn:aws:iam::710015040892:role/prod-docs-docs.docker.com-20220818202218674300000001"
DOCS_S3_BUCKET="prod-docs-docs.docker.com" DOCS_S3_BUCKET="prod-docs-docs.docker.com"
@ -41,6 +42,7 @@ jobs:
DOCS_LAMBDA_FUNCTION_REDIRECTS="DockerDocsRedirectFunction-prod" DOCS_LAMBDA_FUNCTION_REDIRECTS="DockerDocsRedirectFunction-prod"
DOCS_SLACK_MSG="Successfully deployed docs from published branch. $DOCS_URL" DOCS_SLACK_MSG="Successfully deployed docs from published branch. $DOCS_URL"
elif [ "${{ github.ref }}" = "refs/heads/lab" ]; then elif [ "${{ github.ref }}" = "refs/heads/lab" ]; then
HUGO_ENV=lab
DOCS_URL="https://docs-labs.docker.com" DOCS_URL="https://docs-labs.docker.com"
DOCS_AWS_IAM_ROLE="arn:aws:iam::710015040892:role/labs-docs-docs.docker.com-20220818202218402500000001" DOCS_AWS_IAM_ROLE="arn:aws:iam::710015040892:role/labs-docs-docs.docker.com-20220818202218402500000001"
DOCS_S3_BUCKET="labs-docs-docs.docker.com" DOCS_S3_BUCKET="labs-docs-docs.docker.com"
@ -56,7 +58,7 @@ jobs:
SEND_SLACK_MSG="false" SEND_SLACK_MSG="false"
fi fi
echo "BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV echo "BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV
echo "JEKYLL_ENV=$JEKYLL_ENV" >> $GITHUB_ENV echo "HUGO_ENV=$HUGO_ENV" >> $GITHUB_ENV
echo "DOCS_URL=$DOCS_URL" >> $GITHUB_ENV echo "DOCS_URL=$DOCS_URL" >> $GITHUB_ENV
echo "DOCS_AWS_REGION=$DOCS_AWS_REGION" >> $GITHUB_ENV echo "DOCS_AWS_REGION=$DOCS_AWS_REGION" >> $GITHUB_ENV
echo "DOCS_AWS_IAM_ROLE=$DOCS_AWS_IAM_ROLE" >> $GITHUB_ENV echo "DOCS_AWS_IAM_ROLE=$DOCS_AWS_IAM_ROLE" >> $GITHUB_ENV
@ -78,6 +80,8 @@ jobs:
name: Build website name: Build website
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
files: |
docker-bake.hcl
targets: release targets: release
set: | set: |
*.cache-from=type=gha,scope=deploy-${{ env.BRANCH_NAME }} *.cache-from=type=gha,scope=deploy-${{ env.BRANCH_NAME }}
@ -93,12 +97,14 @@ jobs:
name: Upload files to S3 bucket name: Upload files to S3 bucket
if: ${{ env.DOCS_S3_BUCKET != '' }} if: ${{ env.DOCS_S3_BUCKET != '' }}
run: | run: |
aws --region ${{ env.DOCS_AWS_REGION }} s3 sync --acl public-read _site s3://${{ env.DOCS_S3_BUCKET }}/ --delete aws --region ${{ env.DOCS_AWS_REGION }} s3 sync --acl public-read public s3://${{ env.DOCS_S3_BUCKET }}/ --delete
- -
name: Update S3 config name: Update S3 config
if: ${{ env.DOCS_S3_BUCKET != '' && env.DOCS_S3_CONFIG != '' }} if: ${{ env.DOCS_S3_BUCKET != '' && env.DOCS_S3_CONFIG != '' }}
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
files: |
docker-bake.hcl
targets: aws-s3-update-config targets: aws-s3-update-config
set: | set: |
*.cache-from=type=gha,scope=releaser *.cache-from=type=gha,scope=releaser
@ -111,6 +117,8 @@ jobs:
if: ${{ env.DOCS_CLOUDFRONT_ID != '' }} if: ${{ env.DOCS_CLOUDFRONT_ID != '' }}
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
files: |
docker-bake.hcl
targets: aws-cloudfront-update targets: aws-cloudfront-update
env: env:
AWS_REGION: us-east-1 # cloudfront and lambda edge functions are only available in us-east-1 region AWS_REGION: us-east-1 # cloudfront and lambda edge functions are only available in us-east-1 region

View File

@ -1,5 +1,5 @@
# reusable workflow to validate docs from upstream repository for which pages are remotely fetched # reusable workflow to validate docs from upstream repository for which pages are remotely fetched
# - repo: repository to handle from fetch-remote in _config.yml (e.g., https://github.com/docker/buildx) # - repo: upstream repository (e.g., https://github.com/docker/buildx)
# - data-files-id: id of the artifact (using actions/upload-artifact) containing the YAML data files to validate (optional) # - data-files-id: id of the artifact (using actions/upload-artifact) containing the YAML data files to validate (optional)
# - data-files-folder: folder in _data containing the files to download and copy to (e.g., buildx) # - data-files-folder: folder in _data containing the files to download and copy to (e.g., buildx)
name: validate-upstream name: validate-upstream
@ -7,9 +7,6 @@ name: validate-upstream
on: on:
workflow_call: workflow_call:
inputs: inputs:
repo:
required: true
type: string
data-files-id: data-files-id:
required: false required: false
type: string type: string
@ -29,57 +26,16 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
repository: docker/docs repository: docker/docs
-
name: Install js-yaml
run: npm install js-yaml
-
name: Set correct ref to fetch remote resources
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const yaml = require('js-yaml');
const configFile = '_config.yml'
const config = yaml.load(fs.readFileSync(configFile, 'utf8'));
for (const remote of config['fetch-remote']) {
if (remote['repo'] != '${{ inputs.repo }}') {
continue;
}
if ("${{ github.event_name }}" == "pull_request") {
remote['repo'] = "${{ github.event.pull_request.head.repo.html_url }}";
remote['ref'] = "${{ github.event.pull_request.head.ref }}"
} else {
remote['ref'] = "${{ github.ref_name }}";
}
}
try {
fs.writeFileSync(configFile, yaml.dump(config), 'utf8')
} catch (err) {
console.error(err.message)
process.exit(1)
}
-
name: Prepare
run: |
# print docs jekyll config updated in previous step
yq _config.yml
# cleanup js-yaml module and data files
rm -rf ./node_modules
if [[ -n "${{ inputs.data-files-folder }}" ]] && [[ -d "./_data/${{ inputs.data-files-folder }}" ]]; then
rm -rf ./_data/${{ inputs.data-files-folder }}/*
fi
- -
name: Download data files name: Download data files
uses: actions/download-artifact@v3 uses: actions/download-artifact@v3
if: ${{ inputs.data-files-id != '' && inputs.data-files-folder != '' }} if: ${{ inputs.data-files-id != '' && inputs.data-files-folder != '' }}
with: with:
name: ${{ inputs.data-files-id }} name: ${{ inputs.data-files-id }}
path: /tmp/_data/${{ inputs.data-files-folder }} path: /tmp/data/${{ inputs.data-files-folder }}
- -
# Copy data files from /tmp/_data/${{ inputs.data-files-folder }} to # Copy data files from /tmp/data/${{ inputs.data-files-folder }} to
# _data/${{ inputs.data-files-folder }}. If data-files-placeholder-folder # data/${{ inputs.data-files-folder }}. If data-files-placeholder-folder
# is set, then check if a placeholder file exists for each data file in # is set, then check if a placeholder file exists for each data file in
# that folder. If not, then creates a placeholder file with the same # that folder. If not, then creates a placeholder file with the same
# name as the data file, but with a .md extension. # name as the data file, but with a .md extension.
@ -90,19 +46,19 @@ jobs:
script: | script: |
const fs = require('fs'); const fs = require('fs');
const path = require('path'); const path = require('path');
const dataFilesPlaceholderFolder = `${{ inputs.data-files-placeholder-folder }}`; const dataFilesPlaceholderFolder = `content/${{ inputs.data-files-placeholder-folder }}`;
const globber = await glob.create(`/tmp/_data/${{ inputs.data-files-folder }}/*.yaml`); const globber = await glob.create(`/tmp/data/${{ inputs.data-files-folder }}/*.yaml`);
for await (const yamlSrcPath of globber.globGenerator()) { for await (const yamlSrcPath of globber.globGenerator()) {
const yamlSrcFilename = path.basename(yamlSrcPath); const yamlSrcFilename = path.basename(yamlSrcPath);
const yamlDestPath = path.join('_data', `${{ inputs.data-files-folder }}`, yamlSrcFilename); const yamlDestPath = path.join('data', `${{ inputs.data-files-folder }}`, yamlSrcFilename);
const placeholderPath = path.join(dataFilesPlaceholderFolder, yamlSrcFilename.replace(/^docker_/, '').replace(/\.yaml$/, '.md')); const placeholderPath = path.join(dataFilesPlaceholderFolder, yamlSrcFilename.replace(/^docker_/, '').replace(/\.yaml$/, '.md'));
if (dataFilesPlaceholderFolder !== '' && !fs.existsSync(placeholderPath)) { if (dataFilesPlaceholderFolder !== '' && !fs.existsSync(placeholderPath)) {
const placeholderContent = `--- const placeholderContent = `---
datafolder: ${{ inputs.data-files-folder }} datafolder: ${{ inputs.data-files-folder }}
datafile: ${yamlSrcFilename.replace(/\.[^/.]+$/, '')} datafile: ${yamlSrcFilename.replace(/\.[^/.]+$/, '')}
title: ${yamlSrcFilename.replace(/\.[^/.]+$/, "").replaceAll('_', ' ')} title: ${yamlSrcFilename.replace(/\.[^/.]+$/, "").replaceAll('_', ' ')}
--- layout: cli
{% include cli.md datafolder=page.datafolder datafile=page.datafile %}`; ---`;
await core.group(`creating ${placeholderPath}`, async () => { await core.group(`creating ${placeholderPath}`, async () => {
core.info(placeholderContent); core.info(placeholderContent);
}); });
@ -118,7 +74,11 @@ jobs:
name: Validate name: Validate
uses: docker/bake-action@v2 uses: docker/bake-action@v2
with: with:
files: |
docker-bake.hcl
targets: validate targets: validate
set: | set: |
*.args.REPO="github.com/${{ github.repository }}"
*.args.HUGO_MODULE_REPLACEMENTS="github.com/${{ github.repository }} -> github.com/${{ github.repository}} ${{ github.ref }}"
*.cache-from=type=gha,scope=docs-upstream *.cache-from=type=gha,scope=docs-upstream
*.cache-to=type=gha,scope=docs-upstream,mode=max *.cache-to=type=gha,scope=docs-upstream,mode=max

16
.gitignore vendored
View File

@ -1,13 +1,9 @@
**/.DS_Store **/.DS_Store
**/desktop.ini **/desktop.ini
.bundle/**
.jekyll-cache
.jekyll-metadata
_site/**
.sass-cache/**
.vscode .vscode
CNAME node_modules
_kbase/** hugo_stats.json
/vendor .hugo_build.lock
/lint resources
tmp/.htmltest/** public
tmp

View File

@ -1,4 +1,4 @@
DirectoryPath: "_site" DirectoryPath: "public"
EnforceHTTPS: false EnforceHTTPS: false
CheckDoctype: false CheckDoctype: false
CheckExternal: false CheckExternal: false

View File

@ -1,21 +0,0 @@
# https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md
#
# When updating rules in this file, ensure the corresponding rule list in
# .markdownlint.json is also updated.
# style
rule 'header-style'
rule 'hr-style'
# whitespace rules
rule 'no-missing-space-atx'
rule 'no-multiple-space-atx'
rule 'no-missing-space-closed-atx'
rule 'no-multiple-space-closed-atx'
rule 'no-space-in-emphasis'
rule 'no-space-in-code'
rule 'no-space-in-links'
# miscellaneous
rule 'ol-prefix', :style => :ordered
rule 'no-reversed-links'

View File

3
.prettierrc Normal file
View File

@ -0,0 +1,3 @@
{
"plugins": ["prettier-plugin-tailwindcss"]
}

View File

@ -1 +0,0 @@
2.7.6

29
404.md
View File

@ -1,29 +0,0 @@
---
title: "Sorry, we can't find that page"
permalink: /404.html
skip_feedback: true
notoc: true
sitemap: false
skip_read_time: true
---
There might be a mistake in the URL or you might've clicked a link to content
that no longer exists. If you think it's the latter, please file an issue in
our issue tracker on GitHub.
[**Click here to create a new ticket**]({{ site.repo }}/issues/new){:.newissue.button.primary-btn}
[![404 page not found](/assets/images/404-docs.png)](/ "Go to the homepage")
<script>
let el = document.querySelector("a.newissue");
if (el) {
let url = new URL("{{ site.repo }}/issues/new");
url.searchParams.set("template", "broken_link.yml")
url.searchParams.set("title", "[404]: " + window.location.pathname);
url.searchParams.set("target", window.location.href);
url.searchParams.set("location", document.referrer);
url.searchParams.set("labels", "status/triage");
el.setAttribute("href", url.toString());
}
</script>

View File

@ -1,133 +1,41 @@
# syntax=docker/dockerfile:1 # syntax=docker/dockerfile:1
# This Dockerfile builds the docs for https://docs.docker.com/ ARG GO_VERSION=1.21
# from the main branch of https://github.com/docker/docs
# Use same ruby version as the one in .ruby-version FROM golang:${GO_VERSION}-alpine as base
# that is used by Netlify
ARG RUBY_VERSION=2.7.6
# Same as the one in Gemfile.lock
ARG BUNDLER_VERSION=2.3.13
ARG JEKYLL_ENV=development
ARG DOCS_URL=http://localhost:4000
ARG DOCS_ENFORCE_GIT_LOG_HISTORY=0
# Base stage for building
FROM ruby:${RUBY_VERSION}-alpine AS base
WORKDIR /src WORKDIR /src
RUN apk add --no-cache bash build-base git RUN apk --update add nodejs npm git
# Gem stage will install bundler used as dependency manager FROM base as node
# for our dependencies in Gemfile for Jekyll COPY package*.json .
FROM base AS gem RUN npm install
ARG BUNDLER_VERSION
COPY Gemfile* .
RUN gem uninstall -aIx bundler \
&& gem install bundler -v ${BUNDLER_VERSION} \
&& bundle config set force_ruby_platform true \
&& bundle install --jobs 4 --retry 3
# Vendor Gemfile for Jekyll FROM base as hugo
FROM gem AS vendored ARG HUGO_VERSION=0.116.1
ARG BUNDLER_VERSION ARG TARGETARCH
RUN bundle update \ WORKDIR /bin
&& mkdir /out \ RUN go install github.com/gohugoio/hugo@v${HUGO_VERSION}
&& cp Gemfile.lock /out
# Stage used to output the vendored Gemfile.lock: FROM base as build-base
# > make vendor COPY --from=hugo $GOPATH/bin/hugo /bin/hugo
# or COPY --from=node /src/node_modules /src/node_modules
# > docker buildx bake vendor
FROM scratch AS vendor
COPY --from=vendored /out /
# Build the static HTML for the current docs. FROM build-base as build
# After building with jekyll, fix up some links ARG HUGO_ENV
FROM gem AS generate
ARG JEKYLL_ENV
ARG DOCS_URL ARG DOCS_URL
ARG DOCS_ENFORCE_GIT_LOG_HISTORY COPY . .
ENV TARGET=/out RUN /bin/hugo --gc --minify -d /out -e $HUGO_ENV -b $DOCS_URL
RUN --mount=type=bind,target=.,rw \
--mount=type=cache,target=/tmp/docker-docs-clone \
--mount=type=cache,target=/src/.jekyll-cache <<EOT
set -eu
CONFIG_FILES="_config.yml"
if [ "${JEKYLL_ENV}" = "production" ]; then
CONFIG_FILES="${CONFIG_FILES},_config_production.yml"
elif [ "${DOCS_URL}" = "https://docs-stage.docker.com" ]; then
CONFIG_FILES="${CONFIG_FILES},_config_stage.yml"
fi
set -x
bundle exec jekyll build --profile -d ${TARGET} --config ${CONFIG_FILES}
EOT
# htmltest checks for broken links FROM scratch as release
FROM wjdp/htmltest:v0.17.0 as htmltest-base COPY --from=build /out /
RUN --mount=type=bind,from=generate,source=/out,target=_site \
--mount=type=bind,source=.htmltest.yml,target=.htmltest.yml \
<<EOF
htmltest > /results 2>&1
rc=$?
if [[ $rc -eq 0 ]]; then
echo -n > /results
fi
EOF
FROM base as htmltest FROM davidanson/markdownlint-cli2:v0.6.0 as lint
COPY --from=htmltest-base /results /results USER root
RUN <<EOF RUN --mount=type=bind,target=. \
cat /results /usr/local/bin/markdownlint-cli2 content/**/*.md
[ ! -s /results ] || exit 1
EOF
FROM scratch as htmltest-output FROM wjdp/htmltest:v0.17.0 as test
COPY --from=htmltest-base /results /results WORKDIR /test
COPY --from=build /out ./public
# mdl is a lint tool for markdown files ADD .htmltest.yml .htmltest.yml
FROM gem AS mdl-base RUN htmltest
ARG MDL_JSON
ARG MDL_STYLE
RUN --mount=type=bind,target=. <<EOF
mdl --ignore-front-matter ${MDL_JSON:+'--json'} --style=${MDL_STYLE:-'.markdownlint.rb'} $( \
find '.' -name '*.md' \
-not -path './registry/*' \
-not -path './desktop/extensions-sdk/*' \
) > /results
rc=$?
if [[ $rc -eq 0 ]]; then
echo -n > /results
fi
EOF
FROM mdl-base as mdl
RUN <<EOF
cat /results
[ ! -s /results ] || exit 1
EOF
FROM scratch as mdl-output
COPY --from=mdl-base /results /results
# Release the generated files in a scratch image
# Can be output to your host with:
# > make release
# or
# > docker buildx bake release
FROM scratch AS release
COPY --from=generate /out /
# Create a runnable nginx instance with generated HTML files.
# When the image is run, it starts Nginx and serves the docs at port 4000:
# > make deploy
# or
# > docker compose up --build
FROM nginx:alpine AS deploy
COPY --from=release / /usr/share/nginx/html
COPY _deploy/nginx/default.conf /etc/nginx/conf.d/default.conf
ARG JEKYLL_ENV
ENV JEKYLL_ENV=${JEKYLL_ENV}
CMD echo -e "Docker docs are viewable at:\nhttp://0.0.0.0:4000 (build target: ${JEKYLL_ENV})"; exec nginx -g 'daemon off;'
FROM deploy

22
Gemfile
View File

@ -1,22 +0,0 @@
source 'https://rubygems.org'
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
gem 'jekyll', '4.2.2'
group :jekyll_plugins do
gem 'jekyll-redirect-from'
gem 'jekyll-relative-links'
gem 'jekyll-sitemap'
end
# FIXME: This is a workaround for a bug in rouge console lexer
# introduced by https://github.com/rouge-ruby/rouge/pull/1779
# more info: https://github.com/docker/docs/issues/14788
gem 'rouge', '3.27.0'
gem 'front_matter_parser', '1.0.1'
gem 'git', '1.13.0'
gem 'mdl', '0.11.0'
gem 'octopress-hooks', '2.6.2'
gem 'rake', '13.0.6'

View File

@ -1,107 +0,0 @@
GEM
remote: https://rubygems.org/
specs:
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
chef-utils (18.0.161)
concurrent-ruby
colorator (1.1.0)
concurrent-ruby (1.1.10)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.15.5)
forwardable-extended (2.6.0)
front_matter_parser (1.0.1)
git (1.13.0)
addressable (~> 2.8)
rchardet (~> 1.8)
http_parser.rb (0.8.0)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
jekyll (4.2.2)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (~> 0.4.0)
pathutil (~> 0.9)
rouge (~> 3.0)
safe_yaml (~> 1.0)
terminal-table (~> 2.0)
jekyll-redirect-from (0.16.0)
jekyll (>= 3.3, < 5.0)
jekyll-relative-links (0.6.1)
jekyll (>= 3.3, < 5.0)
jekyll-sass-converter (2.2.0)
sassc (> 2.0.1, < 3.0)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-watch (2.2.1)
listen (~> 3.0)
kramdown (2.4.0)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
listen (3.7.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mdl (0.11.0)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.1)
mixlib-cli (~> 2.1, >= 2.1.1)
mixlib-config (>= 2.2.1, < 4)
mixlib-shellout
mercenary (0.4.0)
mixlib-cli (2.1.8)
mixlib-config (3.0.27)
tomlrb
mixlib-shellout (3.2.7)
chef-utils
octopress-hooks (2.6.2)
jekyll (>= 2.0)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (5.0.1)
rake (13.0.6)
rb-fsevent (0.11.2)
rb-inotify (0.10.1)
ffi (~> 1.0)
rchardet (1.8.0)
rexml (3.2.5)
rouge (3.27.0)
safe_yaml (1.0.5)
sassc (2.4.0)
ffi (~> 1.9)
terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1)
tomlrb (2.0.3)
unicode-display_width (1.8.0)
PLATFORMS
aarch64-linux
arm-linux
x86_64-linux
DEPENDENCIES
front_matter_parser (= 1.0.1)
git (= 1.13.0)
jekyll (= 4.2.2)
jekyll-redirect-from
jekyll-relative-links
jekyll-sitemap
mdl (= 0.11.0)
octopress-hooks (= 2.6.2)
rake (= 13.0.6)
rouge (= 3.27.0)
tzinfo-data
BUNDLED WITH
2.3.13

View File

@ -1,37 +0,0 @@
ifneq (, $(BUILDX_BIN))
export BUILDX_CMD = $(BUILDX_BIN)
else ifneq (, $(shell docker buildx version))
export BUILDX_CMD = docker buildx
else ifneq (, $(shell which buildx))
export BUILDX_CMD = $(which buildx)
else
$(error "Buildx is required: https://github.com/docker/buildx#installing")
endif
# Build website and output to _site folder
release:
rm -rf _site
$(BUILDX_CMD) bake release
# Vendor Gemfile.lock
vendor:
$(BUILDX_CMD) bake vendor
# Run all validators
validate:
$(BUILDX_CMD) bake validate
# Check for broken links
htmlproofer:
$(BUILDX_CMD) bake htmlproofer
# Lint tool for markdown files
mdl:
$(BUILDX_CMD) bake mdl
# Deploy website and run it through Docker compose
# Available in your browser at http://localhost:4000
deploy:
docker compose up --build
.PHONY: buildx-yaml release vendor htmlproofer mdl deploy

View File

@ -1,293 +0,0 @@
##
# Default configuration file
#
# This file overrides options set in _config.yml for production / deploy
##
name: Docker Documentation
repo: https://github.com/docker/docs
markdown: kramdown
highlighter: rouge
incremental: true
permalink: pretty
safe: false
lsi: false
# https://kramdown.gettalong.org/options.html
# https://github.com/kramdown/parser-gfm/blob/master/lib/kramdown/parser/gfm/options.rb
kramdown:
input: GFM
gfm_quirks: [paragraph_end, no_auto_typographic]
hard_wrap: false
html_to_native: true
syntax_highlighter: rouge
toc_levels: 2..3
# https://jekyllrb.com/docs/configuration/liquid/
liquid:
error_mode: strict
# Exclude directories and/or files from the conversion. These exclusions are
# relative to the site's source directory and cannot be outside the source
# directory.
exclude:
- _deploy
- _releaser
- docker-bake.hcl
- LICENSE
- Makefile
- README.md
# Component versions -- address like site.docker_ce_version
# You can't have - characters in these for non-YAML reasons.
# When updating 'latest_engine_api_version', also update 'min_api_threshold' below.
latest_engine_api_version: "1.43"
docker_ce_version: "24.0.0"
compose_v1_version: "1.29.2"
compose_version: "v2.20.3"
compose_file_v3: "3.8"
compose_file_v2: "2.4"
machine_version: "0.16.0"
distribution_version: "2.7"
compose_switch_version: "1.0.4"
buildkit_version: "0.11.6"
# Strings for use in doc examples, e.g. runtime versions.
example_go_version: "1.20"
example_golangci_lint_version: "v1.52"
# Options for displaying minimum API version requirements in the reference pages.
#
# The reference pages show badges for commands and options (flags) that require
# a minimum API version. While this information can be useful if an option was
# added in a recent version of the Docker Engine (and API), these badges are no
# longer relevant to most users if the minimum required version is quite "old".
#
# We assume users reading these pages to be on the current version, or at most
# on the version before that (which is already "unsupported"). Users running
# older versions have bigger problems on their hand, so we're not accounting for
# those.
#
# So, to reduce unnecessary clutter on the page, we only show the minimum required
# API version if it requires a relatively recent version of the Engine.
#
# The "min_api_threshold" option specifies the minimum required API version for
# which we show a badge (currently: API v1.40, or "Docker 19.03").
min_api_threshold: 1.40
# Enable search autocompletion (requires metadata.json to be generated)
local_search: true
# List of plugins to enable for local development builds. Mostly the same as
# for production.
plugins:
- jekyll-redirect-from
- jekyll-relative-links
- jekyll-sitemap
# Assets
#
# We specify the directory for Jekyll so we can use @imports.
#
# For local development, we build css with the "expanded" format to produce
# human-readable output for easier debugging.
sass:
sass_dir: _scss
style: expanded
# Setting options here prevents having to repeat the same option in front-matter
# on every page.
# https://jekyllrb.com/docs/configuration/front-matter-defaults/
defaults:
- scope:
path: ""
type: "pages"
values:
layout: docs
toc_min: 2
toc_max: 4
# Exclude from sitemap
- scope:
path: "desktop/enterprise"
values:
sitemap: false
- scope:
path: "assets/**"
values:
sitemap: false
- scope:
path: "**/nav.html"
values:
sitemap: false
- scope:
path: "google*.html"
values:
sitemap: false
- scope:
path: "**/*.pdf"
values:
sitemap: false
# Set the correct edit-URL for some local and remote resources. We usually don't create a direct
# edit link for these, and instead point to the directory that contains the file.
- scope:
path: engine/reference
values:
# FIXME: This edit url is as "best-effort" and doesn't match anything in docker/cli repo for plugins for example. It should be generated autmatically.
edit_url: "https://github.com/docker/cli/tree/master/docs/reference"
- scope:
path: engine/reference/commandline
values:
edit_url: "https://github.com/docker/cli/tree/master/docs/reference/commandline"
skip_read_time: true
- scope:
path: glossary.md
values:
edit_url: "https://github.com/docker/docs/blob/master/_data/glossary.yaml"
# Fetch upstream resources (reference documentation) used by _plugins/fetch_remote.rb
# - repo is the GitHub repository to fetch from
# - default_branch used to generate edit_url link
# - ref the Git reference
# - paths is a list to the resources within the remote repository
# - dest is the destination path within the working tree
# - src is a list of glob source paths within the remote repository
fetch-remote:
- repo: "https://github.com/docker/cli"
default_branch: "master"
ref: "24.0"
paths:
- dest: "engine/extend"
src:
- "docs/extend/**"
- dest: "engine"
src:
- "docs/deprecated.md"
- dest: "engine/reference"
src:
- "docs/reference/run.md"
- dest: "engine/reference/commandline"
src:
- "docs/reference/commandline/cli.md"
- "docs/reference/commandline/dockerd.md"
- repo: "https://github.com/docker/docker"
default_branch: "master"
ref: "24.0"
paths:
- dest: "engine/api"
src:
- "docs/api/**"
- repo: "https://github.com/docker/compose-cli"
default_branch: "main"
ref: "main"
paths:
- dest: "cloud"
src:
- "docs/*.md"
- "!docs/README.md" # readme to make things nice in the compose-cli repo, but meaningless here
- "!docs/architecture.md" # Compose-CLI architecture, unrelated to cloud integration
- repo: "https://github.com/distribution/distribution"
default_branch: "main"
ref: "main"
paths:
- dest: "registry/spec"
src:
- "docs/spec/**"
- "!docs/spec/api.md.tmpl"
- dest: "registry"
src:
- "docs/configuration.md"
- repo: "https://github.com/moby/buildkit"
default_branch: "master"
ref: "master"
paths:
- dest: "engine/reference/builder.md"
src:
- "frontend/dockerfile/docs/reference.md"
- dest: "build/buildkit/toml-configuration.md"
src:
- "docs/buildkitd.toml.md"
- dest: "build/attestations/slsa-definitions.md"
src:
- "docs/attestations/slsa-definitions.md"
- dest: "build/attestations/attestation-storage.md"
src:
- "docs/attestations/attestation-storage.md"
- repo: "https://github.com/compose-spec/compose-spec"
default_branch: "master"
ref: "master"
paths:
- dest: "compose/compose-file/01-status.md"
src:
- "01-status.md"
- dest: "compose/compose-file/02-model.md"
src:
- "02-model.md"
- dest: "compose/compose-file/03-compose-file.md"
src:
- "03-compose-file.md"
- dest: "compose/compose-file/04-version-and-name.md"
src:
- "04-version-and-name.md"
- dest: "compose/compose-file/05-services.md"
src:
- "05-services.md"
- dest: "compose/compose-file/06-networks.md"
src:
- "06-networks.md"
- dest: "compose/compose-file/07-volumes.md"
src:
- "07-volumes.md"
- dest: "compose/compose-file/08-configs.md"
src:
- "08-configs.md"
- dest: "compose/compose-file/09-secrets.md"
src:
- "09-secrets.md"
- dest: "compose/compose-file/10-fragments.md"
src:
- "10-fragments.md"
- dest: "compose/compose-file/11-extension.md"
src:
- "11-extension.md"
- dest: "compose/compose-file/12-interpolation.md"
src:
- "12-interpolation.md"
- dest: "compose/compose-file/13-merge.md"
src:
- "13-merge.md"
- dest: "compose/compose-file/14-include.md"
src:
- "14-include.md"
- dest: "compose/compose-file/15-profiles.md"
src:
- "15-profiles.md"
- dest: "compose/compose-file/build.md"
src:
- "build.md"
- dest: "compose/compose-file/deploy.md"
src:
- "deploy.md"
- repo: "https://github.com/docker/buildx"
default_branch: "master"
ref: "v0.11"
paths:
- dest: "build/bake/reference.md"
src:
- "docs/bake-reference.md"
- repo: "https://github.com/docker/scout-cli"
default_branch: "main"
ref: "v0.20.0"
paths:
- dest: "_data/scout-cli"
src:
- "docs/*.yaml"

View File

@ -1,19 +0,0 @@
##
# This file overrides options set in _config.yml for production / deploy
##
# Google Analytics, etc.
google_analytics: GTM-WL2QLG5
onetrust_id: 8e0ebfd9-035d-4ec2-9b2f-a2de9c09f906
hotjar_id: 3169877
# Assets
#
# For production/deploy, we build css with the "compressed" format, to produce
# smaller files.
sass:
style: compressed
collections:
samples:
output: true

View File

@ -1,5 +0,0 @@
##
# This file overrides options set in _config.yml for staging environment (https://docs-stage.docker.com/)
##
hotjar_id: 3218181

View File

@ -1,19 +0,0 @@
#TODO: work out how to add a data dir to any repo that has documentation
# atm, repo's have a docs dir that is akin to the hugo content dir.
# Define Advisory texts
# can be used in page frontmatter, e.g.:
# advisory: experimental
texts:
experimental: "The functionality described on this page is marked as Experimental, and as such, may change before it becomes generally available."
# URL based advisories
# any URL that begins with "/engine/" will get the "engine" advisory
# will be over-ridden by the `advisory` frontmatter in the topic
# [paths]
# "/engine/" = "engine"
# "/swarm/" = "swarm"

View File

@ -1,7 +0,0 @@
FROM starefossen/github-pages:137
VOLUME /usr/src/app
EXPOSE 4000
CMD jekyll serve -d /_site --watch -H 0.0.0.0 -P 4000

View File

@ -1,26 +0,0 @@
server {
# Use relative redirects to account for situations where a front-end proxy is
# used and the container does not know the public domain and port
absolute_redirect off;
listen 4000;
error_page 403 404 /404.html;
root /usr/share/nginx/html;
index index.html;
# Enable aio for better performance (see https://www.nginx.com/blog/thread-pools-boost-performance-9x/)
aio threads;
location ~ ^/v([\d\.]+)/(.*)$ {
# Archive URLs: first try if the given file is still hosted, otherwise
# redirect to the same URL in the current version of the docs.
try_files $uri $uri/ @redirect_current;
}
location @redirect_current {
# Do a 301 (moved permanently) redirect of archive pages we didn't find
# to the same location in the current docs. Note that the location redirected
# to may not (or no longer) exist, and as such could result in another 301
# redirect, or a 404.
rewrite ^/v([\d\.]+)/(.*)$ /$2 permanent;
}
}

View File

@ -1,32 +0,0 @@
{% if include.product == "admin" %}
{% assign product_link="[Docker Admin](https://admin.docker.com)" %}
{% if include.layer == "company" %}
{% assign domain_navigation="Select your company in the left navigation drop-down menu, and then select **Domain management**." %}
{% else" %}
{% assign domain_navigation="Select your organization in the left navigation drop-down menu, and then select **Domain management**." %}
{% endif %}
{% else %}
{% assign product_link="[Docker Hub](https://hub.docker.com)" %}
{% assign domain_navigation="Navigate to the domain settings page for your organization or company.
- Organization: Select **Organizations**, your organization, **Settings**, and then **Security**.
- Company: Select **Organizations**, your company, and then **Settings**." %}
{% endif %}
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ domain_navigation }}
3. Select **Add a domain**.
4. Continue with the on-screen instructions to get a verification code for your domain as a **TXT Record Value**.
>**Note**
>
> Format your domains without protocol or www information, for example, `yourcompany.example`. This should include all email domains and subdomains users will use to access Docker, for example `yourcompany.example` and `us.yourcompany.example`. Public domains such as `gmail.com`, `outlook.com`, etc. arent permitted.
5. Add your domain verification code as a new TXT record to your Domain Name System (DNS). The steps to do so may vary depending on your DNS provider.
>**Note**
>
> Make sure that the TXT record name that you create on your DNS matches the domain you registered on Docker in Step 4. For example, if you registered the subdomain `us.yourcompany.example`, you need to create a TXT record within the same name/zone `us`. A root domain such as `yourcompany.example` needs a TXT record on the root zone, which is typically denoted with the `@` name for the record.
6. Once you have waited 72 hours for the TXT record verification, you can then select **Verify** next to the domain you've added, and follow the on-screen instructions.

View File

@ -1,40 +0,0 @@
{% if include.product == "admin" %}
{% assign product_link="[Docker Admin](https://admin.docker.com)" %}
{% assign iam_navigation="Select your organization in the left navigation drop-down menu, and then select **Image Access**." %}
{% else %}
{% assign product_link="[Docker Hub](https://hub.docker.com)" %}
{% assign iam_navigation="Select **Organizations**, your organization, **Settings**, and then select **Image Access**." %}
{% endif %}
>Note
>
>Image Access Management is available to [Docker Business](/subscription/details/) customers only.
Image Access Management gives administrators control over which types of images, such as Docker Official Images, Docker Verified Publisher Images, or community images, their developers can pull from Docker Hub.
For example, a developer, who is part of an organization, building a new containerized application could accidentally use an untrusted, community image as a component of their application. This image could be malicious and pose a security risk to the company. Using Image Access Management, the organization owner can ensure that the developer can only access trusted content like Docker Official Images, Docker Verified Publisher Images, or the organizations own images, preventing such a risk.
## Prerequisites
You need to [configure a registry.json to enforce sign-in](/docker-hub/configure-sign-in/). For Image Access Management to take effect, Docker Desktop users must authenticate to your organization.
## Configure Image Access Management permissions
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ iam_navigation }}
3. Enable Image Access Management to set the permissions for the following categories of images you can manage:
- **Organization Images**: When Image Access Management is enabled, images from your organization are always allowed. These images can be public or private created by members within your organization.
- **Docker Official Images**: A curated set of Docker repositories hosted on Hub. They provide OS repositories, best practices for Dockerfiles, drop-in solutions, and applies security updates on time.
- **Docker Verified Publisher Images**: published by Docker partners that are part of the Verified Publisher program and are qualified to be included in the developer secure supply chain. You can set permissions to **Allowed** or **Restricted**.
- **Community Images**: Images are always disabled when Image Access Management is enabled. These images are not trusted because various Docker Hub users contribute them and pose security risks.
> **Note**
>
> Image Access Management is turned off by default. However, owners in your organization have access to all images regardless of the settings.
4. Select the category restrictions for your images by selecting **Allowed**.
Once the restrictions are applied, your members can view the organization permissions page in a read-only format.
## Verify the restrictions
The new Image Access Management policy takes effect after the developer successfully authenticates to Docker Desktop using their organization credentials. If a developer attempts to pull a disallowed image type using Docker, they receive an error message.

View File

@ -1,117 +0,0 @@
{% if include.product == "admin" %}
{% assign product_link="[Docker Admin](https://admin.docker.com)" %}
{% assign invite_button = "**Invite**" %}
{% assign remove_button = "**Remove member**" %}
{% if include.layer == "company" %}
{% assign sso_navigation="Select your company in the left navigation drop-down menu, and then select **SSO & SCIM**." %}
{% assign domain_navigation="Select your company in the left navigation drop-down menu, and then select **Domain management**." %}
{% assign member_navigation="Select your organization in the left navigation drop-down menu, and then select **Users**." %}
{% assign remove_button = "**Remove user**" %}
{% assign scim_link="[Set up SCIM](/admin/company/settings/scim/)" %}
{% assign mapping_link="[Enable Group mapping](/admin/company/settings/group-mapping/)" %}
{% assign sso_mgmt_link ="[Manage your SSO connections](/admin/company/settings/sso-management/)" %}
{% else %}
{% assign sso_navigation="Select your organization in the left navigation drop-down menu, and then select **SSO & SCIM.**" %}
{% assign member_navigation="Select your organization in the left navigation drop-down menu, and then select **Members**." %}
{% assign domain_navigation="Select your organization in the left navigation drop-down menu, and then select **Domain management**." %}
{% assign remove_button = "**Remove member**" %}
{% assign scim_link="[Set up SCIM](/admin/organization/security-settings/scim/)" %}
{% assign mapping_link="[Enable Group mapping](/admin/organization/security-settings/group-mapping/)" %}
{% assign sso_mgmt_link ="[Manage your SSO connections](/admin/organization/security-settings/sso-management/)" %}
{% endif %}
{% else %}
{% assign product_link="[Docker Hub](https://hub.docker.com)" %}
{% assign sso_navigation="Navigate to the SSO settings page for your organization or company.
- Organization: Select **Organizations**, your organization, **Settings**, and then **Security**.
- Company: Select **Organizations**, your company, and then **Settings**." %}
{% assign domain_navigation="Navigate to the domain settings page for your organization or company.
- Organization: Select **Organizations**, your organization, **Settings**, and then **Security**.
- Company: Select **Organizations**, your company, and then **Settings**." %}
{% assign member_navigation="Select **Organizations, your organization, and then **Members**." %}
{% assign invite_button = "**Invite members**" %}
{% assign remove_button = "**Remove member**" %}
{% assign scim_link="[Set up SCIM](/docker-hub/scim/)" %}
{% assign mapping_link="[Enable Group mapping](/docker-hub/group-mapping/)" %}
{% assign sso_mgmt_link ="[Manage your SSO connections](/single-sign-on/manage/)" %}
{% endif %}
## Step two: Create an SSO connection
> **Important**
>
> If your IdP setup requires an Entity ID and the ACS URL, you must select the
> **SAML** tab in the **Authentication Method** section. For example, if your
> Azure AD Open ID Connect (OIDC) setup uses SAML configuration within Azure
> AD, you must select **SAML**. If you are [configuring Open ID Connect with Azure AD](https://docs.microsoft.com/en-us/powerapps/maker/portals/configure/configure-openid-settings){: target="_blank" rel="noopener" class="_"} select
> **Azure AD** as the authentication method. Also, IdP initiated connections
> aren't supported at this time.
{: .important}
After your domain is verified, create an SSO connection.
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ sso_navigation }}
3. In the SSO connections table select **Create Connection**, and create a name for the connection.
> **Note**
>
> You have to verify at least one domain before creating the connections.
4. Select an authentication method, **SAML** or **Azure AD (OIDC)**.
5. Copy the following fields and add them to your IdP:
- SAML: **Entity ID**, **ACS URL**
- Azure AD (OIDC): **Redirect URL**
![SAML](/docker-hub/images/saml-create-connection.png){: width="500px" }
![Azure AD](/docker-hub/images/azure-create-connection.png){: width="500px" }
6. From your IdP, copy and paste the following values into the settings in the Docker console:
- SAML: **SAML Sign-on URL**, **x509 Certificate**
- Azure AD (OIDC): **Client ID**, **Client Secret**, **Azure AD Domain**
7. Select the verified domains you want to apply the connection to.
8. To provision your users, select the organization(s) and/or team(s).
9. Review your summary and select **Create Connection**.
## Step three: Test your SSO configuration
After youve completed the SSO configuration process in Docker, you can test the configuration when you sign in to {{ product_link }} using an incognito browser. Sign in to {{ product_link }} using your domain email address. You are then redirected to your IdP's login page to authenticate.
1. Authenticate through email instead of using your Docker ID, and test the login process.
2. To authenticate through CLI, your users must have a PAT before you enforce SSO for CLI users.
>**Important**
>
> SSO has Just-In-Time (JIT) Provisioning enabled by default. This means your users are auto-provisioned into a team called 'Company' within your organization on Docker Hub.
>
> You can change this on a per-app basis. To prevent auto-provisioning users, you can create a security group in your IdP and configure the SSO app to authenticate and authorize only those users that are in the security group. Follow the instructions provided by your IdP:
> - [Okta](https://help.okta.com/en-us/Content/Topics/Security/policies/configure-app-signon-policies.htm)
> - [AzureAD](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-restrict-your-app-to-a-set-of-users)
{: .important}
The SSO connection is now created. You can continue to set up SCIM without enforcing SSO log-in. For more information about setting up SCIM, see {{ scim_link }}.
## Optional step four: Enforce SSO
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ sso_navigation }}
3. In the SSO connections table, select the **Action** icon and then **Enable enforcement**.
When SSO is enforced, your users are unable to modify their email address and password, convert a user account to an organization, or set up 2FA through Docker Hub. You must enable 2FA through your IdP.
4. Continue with the on-screen instructions and verify that youve completed the tasks.
5. Select **Turn on enforcement** to complete.
Your users must now sign in to Docker with SSO.
> **Important**
>
> If SSO isn't enforced, users can choose to sign in with either their Docker ID or SSO.
{: .important}
## What's next?
- {{ sso_mgmt_link }}
- {{ scim_link }}
- {{ mapping_link }}

View File

@ -1,100 +0,0 @@
{% if include.product == "admin" %}
{% assign product_link="[Docker Admin](https://admin.docker.com)" %}
{% assign invite_button = "**Invite**" %}
{% if include.layer == "company" %}
{% assign sso_navigation="Select your company in the left navigation drop-down menu, and then select **SSO & SCIM**." %}
{% assign member_navigation="Select your organization in the left navigation drop-down menu, and then select **Users**." %}
{% assign remove_button = "**Remove user**" %}
{% assign scim_link="[Set up SCIM](/admin/company/settings/scim/)" %}
{% assign mapping_link="[Enable Group mapping](/admin/company/settings/group-mapping/)" %}
{% else %}
{% assign sso_navigation="Select your organization in the left navigation drop-down menu, and then select **SSO & SCIM**." %}
{% assign member_navigation="Select your organization in the left navigation drop-down menu, and then select **Members**." %}
{% assign remove_button = "**Remove member**" %}
{% assign scim_link="[Set up SCIM](/admin/organization/security-settings/scim/)" %}
{% assign mapping_link="[Enable Group mapping](/admin/organization/security-settings/group-mapping/)" %}
{% endif %}
{% else %}
{% assign product_link="[Docker Hub](https://hub.docker.com)" %}
{% assign sso_navigation="Navigate to the SSO settings page for your organization or company.
- Organization: Select **Organizations**, your organization, **Settings**, and then **Security**.
- Company: Select **Organizations**, your company, and then **Settings**." %}
{% assign member_navigation="Select **Organizations**, your organization, and then **Members**." %}
{% assign invite_button = "**Invite members**" %}
{% assign remove_button = "**Remove member**" %}
{% assign scim_link="[Set up SCIM](/docker-hub/scim/)" %}
{% assign mapping_link="[Enable Group mapping](/docker-hub/group-mapping/)" %}
{% endif %}
## Manage domains
### Remove a domain from an SSO connection
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ sso_navigation }}
3. In the SSO connections table, select the **Action** icon and then **Edit connection**.
4. Select **Next** to navigate to the section where the connected domains are listed.
5. In the **Domain** drop-down, select the **x** icon next to the domain that you want to remove.
6. Select **Next** to confirm or change the connected organization(s).
7. Select **Next** to confirm or change the default organization and team provisioning selections.
8. Review the **Connection Summary** and select **Save**.
> **Note**
>
> If you want to re-add the domain, a new TXT record value is assigned. You must then complete the verification steps with the new TXT record value.
## Manage SSO connections
### Edit a connection
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ sso_navigation }}
3. In the SSO connections table, select the **Action** icon.
4. Select **Edit connection** to edit your connection.
5. Follow the on-screen instructions to edit the connection.
### Delete a connection
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ sso_navigation }}
3. In the SSO connections table, select the **Action** icon.
4. Select **Delete connection**.
5. Follow the on-screen instructions to delete a connection.
### Deleting SSO
When you disable SSO, you can delete the connection to remove the configuration settings and the added domains. Once you delete this connection, it can't be undone. Users must authenticate with their Docker ID and password or create a password reset if they don't have one.
## Manage users
> **Important**
>
> SSO has Just-In-Time (JIT) Provisioning enabled by default. This means your users are auto-provisioned into a team called 'Company' within your organization.
>
> You can change this on a per-app basis. To prevent auto-provisioning users, you can create a security group in your IdP and configure the SSO app to authenticate and authorize only those users that are in the security group. Follow the instructions provided by your IdP:
> - [Okta](https://help.okta.com/en-us/Content/Topics/Security/policies/configure-app-signon-policies.htm){: target="_blank" rel="noopener" class="_"}
> - [AzureAD](https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-restrict-your-app-to-a-set-of-users){: target="_blank" rel="noopener" class="_"}
{: .important}
### Add guest users when SSO is enabled
To add a guest if they arent verified through your IdP:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. Select {{ invite_button }}.
4. Follow the on-screen instructions to invite the user.
### Remove users from the SSO company
To remove a user:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. Select the action icon next to a users name, and then select {{ remove_button }}.
4. Follow the on-screen instructions to remove the user.
## What's next?
- {{ scim_link }}
- {{ mapping_link }}

View File

@ -1,138 +0,0 @@
{% if include.product == "admin" %}
{% assign product_link="[Docker Admin](https://admin.docker.com)" %}
{% assign invite_button = "**Invite**" %}
{% assign export_button = "the **Action** icon and then select **Export users as CSV**" %}
{% if include.layer == "company" %}
{% assign member_navigation="Select your company in the left navigation drop-down menu, and then select **Users**." %}
{% assign remove_button = "**Remove user**" %}
{% assign update_role = "Select their organization, select the role you want to assign, and then select **Save**." %}
{% else %}
{% assign member_navigation="Select your organization in the left navigation drop-down menu, and then select **Members**." %}
{% assign remove_button = "**Remove member**" %}
{% assign update_role = "Select the role you want to assign, then select **Save**." %}
{% endif %}
{% else %}
{% assign product_link="[Docker Hub](https://hub.docker.com)" %}
{% assign member_navigation="Select **Organizations**, your organization, and then **Members**." %}
{% assign invite_button = "**Invite members**" %}
{% assign remove_button = "**Remove member**" %}
{% assign export_button = "**Export members**" %}
{% assign update_role = "Select the role you want to assign, then select **Save**." %}
{% endif %}
## Invite members
Owners can invite new members to an organization via Docker ID, email address, or via a CSV file containing email addresses. If an invitee does not have a Docker account, they must create an account and verify their email address before they can accept the invitation to join the organization. When inviting members, their pending invitation occupies a seat.
### Invite members via Docker ID or email address
Use the following steps to invite members to your organization via Docker ID or email address. To invite a large amount of members to your organization via CSV file, see the next section.
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. Select {{ invite_button }}.
4. Select **Emails or usernames**.
5. Follow the on-screen instructions to invite members. Invite a maximum of 1000 members and separate multiple entries by comma, semicolon, or space.
> **Note**
>
> When you invite members, you assign them a role. See [Roles and permissions](/docker-hub/roles-and-permissions/) for details about the access permissions for each role.
Pending invitations appear in the table. The invitees receive an email with a link to Docker Hub where they can accept or decline the invitation.
### Invite members via CSV file
To invite multiple members to an organization via a CSV file containing email addresses:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. Select {{ invite_button }}.
4. Select **CSV upload**.
5. Select **Download the template CSV file** to optionally download an example CSV file. The following is an example of the contents of a valid CSV file.
```
email
docker.user-0@example.com
docker.user-1@example.com
```
CSV file requirements:
- The file must contain a header row with at least one heading named `email`. Additional columns are allowed and are ignored in the import.
- The file must contain a maximum of 1000 email addresses (rows). To invite more than 1000 users, create multiple CSV files and perform all steps in this task for each file.
6. Create a new CSV file or export a CSV file from another application.
- To export a CSV file from another application, see the applications documentation.
- To create a new CSV file, open a new file in a text editor, type `email` on the first line, type the user email addresses one per line on the following lines, and then save the file with a .csv extension.
7. Select **Browse files** and then select your CSV file, or drag and drop the CSV file into the **Select a CSV file to upload** box. You can only select one CSV file at a time.
> **Note**
>
> If the amount of email addresses in your CSV file exceeds the number of available seats in your organization, you cannot continue to invite members. To invite members, you can purchase more seats, or remove some email addresses from the CSV file and re-select the new file. To purchase more seats, see [Add seats to your subscription](/subscription/add-seats/) or [Contact sales](https://www.docker.com/pricing/contact-sales/).
8. After the CSV file has been uploaded, select **Review**.
Valid email addresses and any email addresses that have issues appear.
Email addresses may have the following issues:
- **Invalid email**: The email address is not a valid address. The email address will be ignored if you send invites. You can correct the email address in the CSV file and re-import the file.
- **Already invited**: The user has already been sent an invite email and another invite email will not be sent.
- **Member**: The user is already a member of your organization and an invite email will not be sent.
- **Duplicate**: The CSV file has multiple occurrences of the same email address. The user will be sent only one invite email.
9. Follow the on-screen instructions to invite members.
> **Note**
>
> When you invite members, you assign them a role. See [Roles and permissions](/docker-hub/roles-and-permissions/) for details about the access permissions for each role.
Pending invitations appear in the table. The invitees receive an email with a link to Docker Hub where they can accept or decline the invitation.
## Resend invitations
To resend an invitation if the invite is pending or declined:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. In the table, locate the invitee, select the **Action** icon, and then select **Resend invitation**.
4. Select **Invite** to confirm.
## Remove a member or invitee
To remove a member from an organization:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. In the table, select the **Action** icon, and then select {{ remove_button }} or **Remove invitee**.
4. Follow the on-screen instructions to remove the member or invitee.
## Update a member role
Organization owners can manage [roles](/docker-hub/roles-and-permissions/) within an organization. If an organization is part of a company, the company owner can also manage that organization's roles.
> **Note**
>
> If you're the only owner of an organization, you need to assign a new owner before you can edit your role.
To update a member role:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. Find the username of the member whose role you want to edit. In the table, select the **Actions** icon.
4. Select **Edit role**.
5. {{ update_role }}
## Export members
Owners can export a CSV file containing all members.
The CSV file may contain the following fields:
* **Name**: The user's name.
* **Username**: The user's Docker ID.
* **Email**: The user's email address.
* **Type**: The type of user. For example, **Invitee** for users who have not accepted the organization's invite, or **User** for users who are members of the organization.
* **Permission**: The user's organization permissions. For example, **Member** or **Owner**.
* **Teams**: The teams where the user is a member. A team is not listed for invitees.
* **Date Joined**: The time and date when the user was invited to the organization.
* **Member of Organizations**: All organizations the user is a member of within a company.
* **Invited to Organizations**: All organizations the user is an invitee of within a company.
* **Account Created**: The time and date when the user account was created.
To export a CSV file of the members:
1. Sign in to {{ product_link }}{: target="_blank" rel="noopener" class="_"}.
2. {{ member_navigation }}
3. Select {{ export_button }}.

View File

@ -1,13 +0,0 @@
{%- if site.hotjar_id and site.hotjar_id != '' and page.skip_feedback != true -%}
<!-- Hotjar Tracking Code -->
<script>
(function(h,o,t,j,a,r){
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
h._hjSettings={hjid:{{ site.hotjar_id }},hjsv:6};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
</script>
{%- endif -%}

View File

@ -1,7 +0,0 @@
{% if include.GOOGLE_ID and include.GOOGLE_ID != '' %}<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','{{ include.GOOGLE_ID }}');</script>
{% else %}<!-- No Google Analytics ID configured, Google Tag Manager is disabled -->{% endif %}

View File

@ -1,7 +0,0 @@
{% if include.ONETRUST_ID and include.ONETRUST_ID != '' %}<!-- OneTrust Cookies Consent Notice start for http://docs.docker.com -->
<script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="{{ include.ONETRUST_ID }}" ></script>
<script type="text/javascript">
function OptanonWrapper() { }
</script>
<!-- OneTrust Cookies Consent Notice end for http://docs.docker.com -->
{% else %}<!-- No consent manager configured -->{% endif %}

View File

@ -1,126 +0,0 @@
{%- comment -%}
Yet-another hacky way to do things with Liquid
This include constructs breadcrumbs for the page; breadcrumbs are based on the
page's location in the TOC (_data/toc.yaml). To get the "parent" TOC entries
for the current page, we:
- iterate through each of the main sections / categories in the TOC (home, guides,
manuals, reference, samples)
- in each section, we iterate throught pages and sections. "sections" do not
have URLs ("path") of their own, but can contain pages and sub-sections.
Liquid doesn't allow us to "recursively" iterate through these, so we added
code for each nested level (currently accounting for pages to be nested up to
4 levels deep)
- If the item we're checking is a page (i.e., has a "path" property), and the
"path" matches the current page, then we found our "breadcrumb path"; in this
case we store the parent elements into variables (levelX_title, levelX_url).
Liquid doesn't seem to like storing the whole struct into a variable (we can
*store* it in a variable, but the "path" property ends up empty). We also have
to "assign" inside the level-block; likely because variables assigned in the
previous block gets out of scope.
- Because (as mentioned) "sections" themselves currently do not have their own
URL, we don't have a real "parent" URL, so we're using the _first_ page at
each level as the "closest match". In some cases, a section does not contain
pages (only subsections); in those cases, our breadcrumbs will contain "titles"
for parent locations, but no link. (This is something we need to fix: make
sure that each section has a landing-page, and possibly add a "path" field
to sections (containing the landing page of the section).
{%- endcomment -%}
{%- for section in site.data.toc.horizontalnav -%}
{%- for level1 in site.data.toc[section.node] -%}
{%- if level1.path == page.url -%}
{%- assign found = "true" -%}
{%- assign section_title = section.title -%}
{%- assign section_url = section.path -%}
{%- assign level1_title = level1.title -%}
{%- assign level1_url = level1.path -%}
{%- break -%}
{%- endif -%}
{%- for level2 in level1.section -%}
{%- if level2.path == page.url -%}
{%- assign found = "true" -%}
{%- assign section_title = section.title -%}
{%- assign section_url = section.path -%}
{%- assign level1_title = level1.sectiontitle -%}
{%- assign level1_url = level1.section[0].path -%}
{%- assign level2_title = level2.title -%}
{%- assign level2_url = level2.path -%}
{%- break -%}
{%- endif -%}
{%- for level3 in level2.section -%}
{%- if level3.path == page.url -%}
{%- assign found = "true" -%}
{%- assign section_title = section.title -%}
{%- assign section_url = section.path -%}
{%- assign level1_title = level1.sectiontitle -%}
{%- assign level1_url = level1.section[0].path -%}
{%- assign level2_title = level2.sectiontitle -%}
{%- assign level2_url = level2.section[0].path -%}
{%- assign level3_title = level3.title -%}
{%- assign level3_url = level3.path -%}
{%- break -%}
{%- endif -%}
{%- for level4 in level3.section -%}
{%- if level4.path == page.url -%}
{%- assign found = "true" -%}
{%- assign section_title = section.title -%}
{%- assign section_url = section.path -%}
{%- assign level1_title = level1.sectiontitle -%}
{%- assign level1_url = level1.section[0].path -%}
{%- assign level2_title = level2.sectiontitle -%}
{%- assign level2_url = level2.section[0].path -%}
{%- assign level3_title = level3.sectiontitle -%}
{%- assign level3_url = level3.section[0].path -%}
{%- assign level4_title = level4.title -%}
{%- assign level4_url = level4.path -%}
{%- break -%}
{%- endif -%}
{%- for level5 in level4.section -%}
{%- if level5.path == page.url -%}
{%- assign found = "true" -%}
{%- assign section_title = section.title -%}
{%- assign section_url = section.path -%}
{%- assign level1_title = level1.sectiontitle -%}
{%- assign level1_url = level1.section[0].path -%}
{%- assign level2_title = level2.sectiontitle -%}
{%- assign level2_url = level2.section[0].path -%}
{%- assign level3_title = level3.sectiontitle -%}
{%- assign level3_url = level3.section[0].path -%}
{%- assign level4_title = level4.title -%}
{%- assign level4_url = level4.path -%}
{%- assign level5_title = level5.title -%}
{%- assign level5_url = level5.path -%}
{%- break -%}
{%- endif -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
{%- endfor -%}
{%- comment -%}
Some section's overview page are not in the TOC. If we didn't find a matching
page in the TOC so far, use the section itself for the breadcrumb.
{%- endcomment -%}
{%- if section.path == page.url -%}
{%- assign found = "true" -%}
{%- assign section_title = section.title -%}
{%- assign section_url = section.path -%}
{%- break -%}
{%- endif -%}
{%- endfor -%}
{%- if found == "true" -%}
<div class="row hidden-sm hidden-xs">
<nav aria-label="breadcrumb">
<ol class="breadcrumb">
<li><a href="/" title="Docker docs homepage"><i class="fa fa-home"></i></a></li>
<li><a href="{{ section_url }}">{{ section_title }}</a></li>
{%- if level1_title -%}<li><a {%- if level1_url %} href="{{ level1_url }}"{%- endif -%}>{{ level1_title }}</a></li>{%- endif -%}
{%- if level2_title -%}<li><a {%- if level2_url %} href="{{ level2_url }}"{%- endif -%}>{{ level2_title }}</a></li>{%- endif -%}
{%- if level3_title -%}<li><a {%- if level3_url %} href="{{ level3_url }}"{%- endif -%}>{{ level3_title }}</a></li>{%- endif -%}
{%- if level4_title -%}<li><a {%- if level4_url %} href="{{ level4_url }}"{%- endif -%}>{{ level4_title }}</a></li>{%- endif -%}
{%- if level5_title -%}<li><a {%- if level5_url %} href="{{ level5_url }}"{%- endif -%}>{{ level5_title }}</a></li>{%- endif -%}
</ol>
</nav>
</div>
{%- endif -%}

View File

@ -1,156 +0,0 @@
{% capture tabChar %} {% endcapture %}<!-- Make sure atom is using hard tabs -->
{% assign controller_data = site.data[include.datafolder][include.datafile] %}
{% assign parentPath = page.path | prepend: "/" | remove: page.name %}
<br />
{{ controller_data.short | replace_relative_links: page.path }}
{% if controller_data.min_api_version %}
{% comment %}
To reduce unnecessary clutter on the page, we only show the minimum required
API version if it requires a relatively recent version of the Engine, which
is configured through the "min_api_threshold" option in _config.yml
Below, we first convert the min_api_version from a string to a number, so that
we can compare versions (see https://stackoverflow.com/a/27200972/1811501),
then compare it, to decide whether to show the "minimum required API version".
{% endcomment %}
{% assign min_api_version = controller_data.min_api_version | plus: 0 %}
{% if min_api_version >= site.min_api_threshold %}
<a href="/engine/api/v{{ controller_data.min_api_version }}/" target="_blank" rel="noopener" class="_"><span class="badge badge-info" data-toggle="tooltip" data-placement="right" title="Open the {{ controller_data.min_api_version }} API reference (in a new window)">API {{ controller_data.min_api_version }}+</span></a>&nbsp;
The client and daemon API must both be at least
<a href="/engine/api/v{{ controller_data.min_api_version }}/" target="_blank" rel="noopener" class="_">{{ controller_data.min_api_version }}</a>
to use this command. Use the `docker version` command on the client to check
your client and daemon API versions.
{% endif %}
{% endif %}
{% if controller_data.deprecated %}
> This command is [deprecated](/engine/deprecated/){: target="_blank" rel="noopener" class="_"}.
>
> It may be removed in a future Docker version. For more information, see the [Docker Roadmap](https://github.com/docker/roadmap/issues/209){: target="_blank" rel="noopener" class="_"}.
{: .warning }
{% endif %}
{% if controller_data.experimental %}
> This command is experimental.
>
> This command is experimental on the Docker daemon. It should not be used in
> production environments.
> To enable experimental features on the Docker daemon, edit the
> [daemon.json](/engine/reference/commandline/dockerd/#daemon-configuration-file)
> and set `experimental` to `true`.
>
> {% include experimental.md %}
{% endif %}
{% if controller_data.experimentalcli %}
> This command is experimental.
>
> [Experimental features](/engine/reference/commandline/cli/#experimental-features)
> are intended for testing and feedback as their functionality or UX may change
> between releases without warning or can be removed entirely in a future release.
{: .important }
{% endif %}
{% capture command-orchestrator %}
{% if controller_data.swarm %}
<span class="badge badge-info" data-toggle="tooltip" data-placement="right" title="This command works with the Swarm orchestrator.">Swarm</span> This command works with the Swarm orchestrator.
{% endif %}
{% endcapture %}{{ command-orchestrator }}
{% if controller_data.usage %}
## Usage
```console
$ {{ controller_data.usage | replace: tabChar, "" | strip }}{% if controller_data.cname %} COMMAND{% endif %}
```
{% endif %}
{% unless controller_data.long == controller_data.short %}
{% if controller_data.options %}
Refer to the [options section](#options) for an overview of available [`OPTIONS`](#options) for this command.
{% endif %}
## Description
{: name="extended-description"}
{{ controller_data.long | replace_relative_links: page.path }}
{% endunless %}
{% if controller_data.examples %}
For example uses of this command, refer to the [examples section](#examples) below.
{% endif %}
{% if controller_data.options %}
{% if controller_data.inherited_options %}
{% assign alloptions = controller_data.options | concat:controller_data.inherited_options %}
{% else %}
{% assign alloptions = controller_data.options %}
{% endif %}
## Options
<table>
<thead>
<tr>
<td>Name, shorthand</td>
<td>Default</td>
<td>Description</td>
</tr>
</thead>
<tbody>
{% for option in alloptions %}
{% unless option.hidden %}
{% capture deprecated-badge %}{% if option.deprecated %}<a href="/engine/deprecated/" target="_blank" rel="noopener" class="_"><span class="badge badge-danger" data-toggle="tooltip" title="Read the deprecation reference (in a new window).">deprecated</span></a>{% endif %}{% endcapture %}
{% capture experimental-daemon-badge %}{% if option.experimental %}<a href="/engine/reference/commandline/dockerd/#daemon-configuration-file" target="_blank" rel="noopener" class="_"><span class="badge badge-warning" data-toggle="tooltip" title="Read about experimental daemon options (in a new window).">experimental (daemon)</span></a>{% endif %}{% endcapture %}
{% capture experimental-cli-badge %}{% if option.experimentalcli %}<a href="/engine/reference/commandline/cli/#configuration-files" target="_blank" rel="noopener" class="_"><span class="badge badge-warning" data-toggle="tooltip" title="Read about experimental CLI options (in a new window).">experimental (CLI)</span></a>{% endif %}{% endcapture %}
{%- if option.min_api_version -%}
{% assign min_api_version = option.min_api_version | plus: 0 %}
{% if min_api_version >= site.min_api_threshold %}
{% capture min-api %}<a href="/engine/api/v{{ option.min_api_version }}/" target="_blank" rel="noopener" class="_"><span class="badge badge-info" data-toggle="tooltip" title="Open the {{ controller_data.min_api_version }} API reference (in a new window)">API {{ option.min_api_version }}+</span></a>{%endcapture%}
{%- endif -%}
{%- else -%}
{% capture min-api %}{%endcapture%}
{%- endif -%}
{% capture flag-orchestrator %}{% if option.swarm %}<span class="badge badge-info" data-toggle="tooltip" title="This option works for the Swarm orchestrator.">Swarm</span>{% endif %}{% if option.kubernetes %}<span class="badge badge-info" data-toggle="tooltip" title="This option works for the Kubernetes orchestrator.">Kubernetes</span>{% endif %}{% endcapture %}
{% capture all-badges %}{{ deprecated-badge }}{{ experimental-daemon-badge }}{{ experimental-cli-badge }}{{ min-api }}{{ flag-orchestrator }}{% endcapture %}
{% capture defaults-to-skip-str %}[],map[],false,0,0s,default,'',""{% endcapture %}
{% capture defaults-to-skip %}{{ defaults-to-skip-str | split: ',' }}{% endcapture %}
{% capture option-default %}{% if option.default_value %}{% unless defaults-to-skip contains option.default_value or defaults-to-skip == blank %}`{{ option.default_value }}`{% endunless %}{% endif %}{% endcapture %}
<tr>
{% if option.details_url and option.details_url != '' -%}
<td markdown="span" nowrap>[`--{{ option.option }}`]({{ option.details_url }}){% if option.shorthand %} , [`-{{ option.shorthand }}`]({{ option.details_url }}){% endif %}</td>
{%- else -%}
<td markdown="span" nowrap>`--{{ option.option }}`{% if option.shorthand %} , `-{{ option.shorthand }}`{% endif %}</td>
{%- endif %}
<td markdown="span">{{ option-default }}</td>
<td markdown="span">{% if all-badges != '' %}{{ all-badges | strip }}<br />{% endif %}{{ option.description | strip }}</td>
</tr>
{% endunless %}
{% endfor %} <!-- end for option -->
</tbody>
</table>
{% endif %} <!-- end if options -->
{% if controller_data.examples %}
## Examples
{{ controller_data.examples | replace_relative_links: page.path }}
{% endif %}

View File

@ -1,15 +0,0 @@
Docker [introduced the open source Moby
project](https://blog.docker.com/2017/04/introducing-the-moby-project/) to
further promote collaboration, experimentation, and development of
container-based systems in the broader community. Moby is a library of
containerized components, a framework for assembling components into a container
platform, and tools to build, test, and deploy artifacts. It included a
reference assembly, which is the open base for the Docker platform.
You can read about the Moby project, the open framework, components, and
relationship of Docker to Moby at [mobyproject.org](https://mobyproject.org/).
The Moby project lives [here](https://github.com/moby/moby).
See [Contribute to the Moby project](https://github.com/moby/moby/blob/master/CONTRIBUTING.md)
to learn how to help work on the codebase.

View File

@ -1,95 +0,0 @@
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" data-target="#mac-add-keys" data-group="mac">Mac</a></li>
<li><a data-toggle="tab" data-target="#win-add-keys" data-group="win">Windows</a></li>
<li><a data-toggle="tab" data-target="#linux-add-keys" data-group="linux">Linux</a></li>
</ul>
<div class="tab-content">
<div id="mac-add-keys" class="tab-pane fade in active">
<br>
{% capture mac-content-add %}
1. Start the `ssh-agent` in the background using the command `eval "$(ssh-agent -s)"`. You get the agent process ID in return.
```none
eval "$(ssh-agent -s)"
Agent pid 59566
```
2. On macOS Sierra 10.12.2 or newer, modify your
`~/.ssh/config` file to automatically load keys into the `ssh-agent` and store
passphrases in your keychain.
```none
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
```
3. Add your SSH private key to the ssh-agent, using the default macOS `ssh-add` command.
```none
$ ssh-add -K ~/.ssh/id_rsa
```
If you created your key with a different name or have an existing key
with a different name, replace `id_rsa` in the command with the
name of your private key file.
{% endcapture %}
{{ mac-content-add | markdownify }}
<hr>
</div>
<div id="win-add-keys" class="tab-pane fade">
<br>
{% capture win-content-add %}
1. Start the `ssh-agent` in the background.
```none
eval "$(ssh-agent -s)"
Agent pid 59566
```
2. Add your SSH private key to the ssh-agent.
```none
$ ssh-add ~/.ssh/id_rsa
```
If you created your key with a different name or have an existing key
with a different name, replace `id_rsa` in the command with the
name of your private key file.
{% endcapture %}
{{ win-content-add | markdownify }}
<hr>
</div>
<div id="linux-add-keys" class="tab-pane fade">
<br>
{% capture linux-content-add %}
1. Start the `ssh-agent` in the background.
```none
eval "$(ssh-agent -s)"
Agent pid 59566
```
2. Add your SSH private key to the ssh-agent.
```none
$ ssh-add ~/.ssh/id_rsa
```
If you created your key with a different name or have an existing key
with a different name, replace `id_rsa` in the command with the
name of your private key file.
{% endcapture %}
{{ linux-content-add | markdownify }}
<hr>
</div>
</div>

View File

@ -1,76 +0,0 @@
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" data-target="#mac-copy-keys" data-group="mac">Mac</a></li>
<li><a data-toggle="tab" data-target="#win-copy-keys" data-group="win">Windows</a></li>
<li><a data-toggle="tab" data-target="#linux-copy-keys" data-group="linux">Linux</a></li>
</ul>
<div class="tab-content">
<div id="mac-copy-keys" class="tab-pane fade in active">
<br>
{% capture mac-content-copy %}
Copy the public SSH key to your clipboard.
```none
$ pbcopy < ~/.ssh/id_rsa.pub
```
If your SSH key file has a different name than the example code, modify the
filename to match your current setup.
>**Tip:** If you don't have `pbcopy`, you navigate to the hidden `.ssh`
folder, open the file in a text editor, and copy it to your clipboard.
For example: `$ atom ~/.ssh/id_rsa.pub`
{% endcapture %}
{{ mac-content-copy | markdownify }}
<hr>
</div>
<div id="win-copy-keys" class="tab-pane fade">
<br>
{% capture win-content-copy %}
Copy the public SSH key to your clipboard.
```none
$ clip < ~/.ssh/id_rsa.pub
```
If your SSH key file has a different name than the example code, modify the
filename to match your current setup.
>**Tip:** If `clip` doesn't work, navigate the hidden `.ssh`
folder, open the file in a text editor, and copy it to your clipboard.
For example: `$ notepad ~/.ssh/id_rsa.pub`
{% endcapture %}
{{ win-content-copy | markdownify }}
<hr>
</div>
<div id="linux-copy-keys" class="tab-pane fade">
<br>
{% capture linux-content-copy %}
If you don't already have it, install `xclip`. (The example uses `apt-get` to install, but you might want to use another package installer like `yum`.)
```none
$ sudo apt-get install xclip
```
Copy the SSH key to your clipboard.
```none
$ xclip -sel clip < ~/.ssh/id_rsa.pub
```
>**Tip:** If you `xclip` isn't working, navigate to hidden `.ssh` folder,
open the file in a text editor, and copy it to your clipboard.
For example: `$ vi ~/.ssh/id_rsa.pub`
{% endcapture %}
{{ linux-content-copy | markdownify }}
<hr>
</div>
</div>

View File

@ -1,121 +0,0 @@
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" data-target="#mac-find-keys" data-group="mac">Mac</a></li>
<li><a data-toggle="tab" data-target="#win-find-keys" data-group="win">Windows</a></li>
<li><a data-toggle="tab" data-target="#linux-find-keys" data-group="linux">Linux</a></li>
</ul>
<div class="tab-content">
<div id="mac-find-keys" class="tab-pane fade in active">
<br>
{% capture mac-content-find %}
1. Open a command-line terminal.
```none
$ ls -al ~/.ssh
```
This lists files in your `.ssh` directory.
2. Check to see if you already have a SSH keys you can use.
Default file names for public keys are:
* id_dsa.pub
* id_ecdsa.pub
* id_ed25519.pub
* id_rsa.pub
Here are example results showing a public and private key pair with the default names:
```none
drwx------ 8 me staff 272 Mar 27 14:04 .
drwxr-xr-x+ 69 me staff 2346 Apr 7 10:03 ..
-rw-r--r-- 1 me staff 420 Mar 27 14:04 config
-rw------- 1 me staff 3326 Mar 27 14:01 id_rsa
-rw-r--r-- 1 me staff 752 Mar 27 14:01 id_rsa.pub
```
The file `id_rsa` contains the private key which resides on the local machine, and `id_rsa.pub` is the public key we can provide to a remote account.
{% endcapture %}
{{ mac-content-find | markdownify }}
<hr>
</div>
<div id="win-find-keys" class="tab-pane fade">
<br>
{% capture win-content-find %}
1. Open Git Bash.
```none
$ ls -al ~/.ssh
```
This lists files in your `.ssh` directory.
2. Check to see if you already have SSH keys you can use.
Default file names for public keys are:
* id_dsa.pub
* id_ecdsa.pub
* id_ed25519.pub
* id_rsa.pub
Here are example results showing a public and private key pair with the default names:
```none
drwx------ 8 me staff 272 Mar 27 14:04 .
drwxr-xr-x+ 69 me staff 2346 Apr 7 10:03 ..
-rw-r--r-- 1 me staff 420 Mar 27 14:04 config
-rw------- 1 me staff 3326 Mar 27 14:01 id_rsa
-rw-r--r-- 1 me staff 752 Mar 27 14:01 id_rsa.pub
```
The file `id_rsa` contains the private key which resides on the local machine, and `id_rsa.pub` is the public key we can provide to a remote account.
{% endcapture %}
{{ win-content-find | markdownify }}
<hr>
</div>
<div id="linux-find-keys" class="tab-pane fade">
<br>
{% capture linux-content-find %}
1. Open a command-line terminal.
```none
$ ls -al ~/.ssh
```
This lists files in your `.ssh` directory.
2. Check to see if you already have a SSH keys you can use.
Default file names for public keys are:
* id_dsa.pub
* id_ecdsa.pub
* id_ed25519.pub
* id_rsa.pub
Here are example results showing a public and private key pair with the default names:
```none
drwx------ 8 me staff 272 Mar 27 14:04 .
drwxr-xr-x+ 69 me staff 2346 Apr 7 10:03 ..
-rw-r--r-- 1 me staff 420 Mar 27 14:04 config
-rw------- 1 me staff 3326 Mar 27 14:01 id_rsa
-rw-r--r-- 1 me staff 752 Mar 27 14:01 id_rsa.pub
```
The file `id_rsa` contains the private key which resides on the local machine, and `id_rsa.pub` is the public key we can provide to a remote account.
{% endcapture %}
{{ linux-content-find | markdownify }}
<hr>
</div>
</div>

View File

@ -1,109 +0,0 @@
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" data-target="#mac-key-gen" data-group="mac">Mac</a></li>
<li><a data-toggle="tab" data-target="#win-key-gen" data-group="win">Windows</a></li>
<li><a data-toggle="tab" data-target="#linux-key-gen" data-group="linux">Linux</a></li>
</ul>
<div class="tab-content">
<div id="mac-key-gen" class="tab-pane fade in active">
<br>
{% capture mac-content-gen %}
1. Open a command-line terminal.
2. Paste the text below, substituting in your GitHub email address.
```none
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
This creates a new SSH key, using the provided email as a label.
```none
Generating public/private rsa key pair.
```
3. When prompted with "Enter a file in which to save the key", press the Return key (Enter) to accept the default location.
```none
Enter a file in which to save the key (/Users/you/.ssh/id_rsa):
```
4. At the prompt, type a secure passphrase, and re-enter as prompted.
```none
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
{% endcapture %}
{{ mac-content-gen | markdownify }}
<hr>
</div>
<div id="win-key-gen" class="tab-pane fade">
<br>
{% capture win-content-gen %}
1. Open Git Bash.
2. Paste the text below, substituting in your GitHub email address.
```none
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
This creates a new SSH key, using the provided email as a label.
```none
Generating public/private rsa key pair.
```
3. When prompted with "Enter a file in which to save the key", press the Return key (Enter) to accept the default location.
```none
Enter a file in which to save the key (c/Users/you/.ssh/id_rsa):
```
4. At the prompt, type a secure passphrase, and re-enter as prompted.
```none
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
{% endcapture %}
{{ win-content-gen | markdownify }}
<hr>
</div>
<div id="linux-key-gen" class="tab-pane fade">
<br>
{% capture linux-content-gen %}
1. Open a command-line terminal.
2. Paste the text below, substituting in your GitHub email address.
```none
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
This creates a new SSH key, using the provided email as a label.
```none
Generating public/private rsa key pair.
```
3. When prompted with "Enter a file in which to save the key", press the Return key (Enter) to accept the default location.
```none
Enter a file in which to save the key (/home/you/.ssh/id_rsa):
```
4. At the prompt, type a secure passphrase, and re-enter as prompted.
```none
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
{% endcapture %}
{{ linux-content-gen | markdownify }}
<hr>
</div>
</div>

View File

@ -1,14 +0,0 @@
[SSH](/glossary/#SSH) is a secure protocol for accessing remote machines and applications. It
provides authentication and encrypts data communication over insecure networks.
These topics describe how to find existing SSH keys or generate new ones, and
add the public key to your Docker Hub account. GitHub has a good set of
topics on [Connecting to GitHub with
SSH](https://help.github.com/articles/connecting-to-github-with-ssh/), which you
can tailor to SSH scenarios beyond GitHub, including Docker. The quick-look
topics below are derived from that GitHub documentation.
Commands for working with SSH keys are described for Mac, Windows, and Linux.
The Windows steps suggest using [Git Bash](https://git-for-windows.github.io/) but you could also use a tool like
[PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) or
[Bitvise](https://www.bitvise.com/index).

View File

@ -1,17 +0,0 @@
> Download Docker Desktop
>
{% if include.all or include.win -%}
> [Windows](https://desktop.docker.com/win/main/amd64{{ include.build_path }}Docker%20Desktop%20Installer.exe) ([checksum](https://desktop.docker.com/win/main/amd64{{ include.build_path }}checksums.txt){: target="_blank" rel="noopener" class="_"}) {% if include.all or include.mac or include.linux %} | {% endif %}
{% endif -%}
{% if include.all or include.mac -%}
> [Mac with Intel chip](https://desktop.docker.com/mac/main/amd64{{ include.build_path }}Docker.dmg) ([checksum](https://desktop.docker.com/mac/main/amd64{{ include.build_path }}checksums.txt){: target="_blank" rel="noopener" class="_"}) |
> [Mac with Apple chip](https://desktop.docker.com/mac/main/arm64{{ include.build_path }}Docker.dmg) ([checksum](https://desktop.docker.com/mac/main/arm64{{ include.build_path }}checksums.txt){: target="_blank" rel="noopener" class="_"}) {% if include.all or include.linux %} | {% endif %}
{% endif -%}
{% if include.all or include.linux -%}
> [Debian](https://desktop.docker.com/linux/main/amd64{{ include.build_path }}docker-desktop-{{ include.version }}-amd64.deb) -
> [RPM](https://desktop.docker.com/linux/main/amd64{{ include.build_path }}docker-desktop-{{ include.version }}-x86_64.rpm) -
> [Arch package](https://desktop.docker.com/linux/main/amd64{{ include.build_path }}docker-desktop-{{ include.version }}-x86_64.pkg.tar.zst) ([checksum](https://desktop.docker.com/linux/main/amd64{{ include.build_path }}checksums.txt){: target="_blank" rel="noopener" class="_"})
{% endif -%}
{% if include.build_path == "/" -%}
{: .tip}
{% endif -%}

View File

@ -1,8 +0,0 @@
<!-- This is a summary of the license changes related to Docker Desktop. It is included in the Mac and Windows Install topic -->
Heres a summary of the key points:
- Docker Desktop is free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects.
- Otherwise, it requires a paid subscription for professional use.
- Paid subscriptions are also required for government entities.
- The Docker Pro, Team, and Business subscriptions include commercial use of Docker Desktop.

View File

@ -1,30 +0,0 @@
<div class="modal" id="accept-eula" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Download Docker Desktop</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>
Weve updated the <a href="https://www.docker.com/legal/docker-subscription-service-agreement" target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl">Docker Subscription Service Agreement</a> for all versions before 4.0.0 of Docker Desktop.
</p>
<p>
Docker Desktop is free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects. Otherwise, it requires a paid subscription for professional use. Paid subscriptions are also required for government entities. Read the <a href="https://www.docker.com/pricing/faq" target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl">FAQs</a> to learn more.
</p>
<p>
By clicking "Accept and Download", you agree to these updated
<a href="https://www.docker.com/legal/docker-subscription-service-agreement" target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl">terms</a>,
the <a href="https://www.docker.com/legal/data-processing-agreement" target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl">Docker Data Processing Agreement</a>,
and the <a href="https://www.docker.com/legal/docker-privacy-policy" target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl">Data Privacy Policy</a>.
</p>
</div>
<div class="modal-footer">
<a type="button" class="btn btn-primary">Accept and Download</a>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>

View File

@ -1,6 +0,0 @@
<!-- This text will be included in topics containing Docker Desktop download URLs -->
<span class="no-js">Weve updated the [Docker Subscription Service Agreement](https://www.docker.com/legal/docker-subscription-service-agreement){: target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl"}. for all versions before 4.0.0 of Docker Desktop.
Docker Desktop is free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects. Otherwise, it requires a paid subscription for professional use. Paid subscriptions are also required for government entities. [Read the FAQ] (https://www.docker.com/pricing/faq){: target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl"} to learn more.
By clicking **Accept and download**, you agree to these [terms](https://www.docker.com/legal/docker-subscription-service-agreement){: target="_blank" rel="noopener" class="_"},
the [Docker Data Processing Agreement](https://www.docker.com/legal/data-processing-agreement){: target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl"},
and the [Data Privacy Policy](https://www.docker.com/legal/docker-privacy-policy){: target="_blank" rel="noopener" class="_" id="dkr_docs_relnotes_btl"}.</span>

View File

@ -1,107 +0,0 @@
{% comment %}
<div class="newsletter_section">
<div class="container">
<!-- newsletter
<div class="col-md-8">
<form class="form-inline">
<div class="form-group">
<input type="email" class="form-control input" placeholder="email address">
<button type="submit" class="button outline-btn newsletter">Submit</button>
</div>
</form>
</div>-->
</div>
</div>
{% endcomment %}
<div class="container">
<div class="top_footer">
<div class="row">
<div class="col-xs-12 col-sm-3 col-md-3">
<ul class="footer_links">
<li><b><a href="https://www.docker.com/products" target="_blank" rel="noopener">Product offerings</a></b></li>
<li><a href="https://www.docker.com/products/personal" target="_blank" rel="noopener">Docker Personal</a></li>
<li><a href="https://www.docker.com/products/pro" target="_blank" rel="noopener">Docker Pro</a></li>
<li><a href="https://www.docker.com/products/team" target="_blank" rel="noopener">Docker Team</a></li>
<li><a href="https://www.docker.com/products/business" target="_blank" rel="noopener">Docker Business</a></li>
<li><a href="https://www.docker.com/products" target="_blank" rel="noopener">Compare Subscriptions</a></li>
<li><b><a href="https://www.docker.com/" target="_blank" rel="noopener">Features</a></b></li>
<li><a href="https://www.docker.com/products/docker-desktop" target="_blank" rel="noopener">Docker Desktop</a></li>
<li><a href="https://www.docker.com/products/docker-hub" target="_blank" rel="noopener">Docker Hub</a></li>
<li><a href="https://www.docker.com/products/secure-software-supply-chain" target="_blank" rel="noopener">Secure Software Supply Chain</a></li>
<li><a href="https://www.docker.com/products/container-runtime" target="_blank" rel="noopener">Container Runtime</a></li>
<li><a href="https://www.docker.com/products/developer-tools" target="_blank" rel="noopener">Developer Tools</a></li>
<li><a href="https://www.docker.com/partners" target="_blank" rel="noopener">Trusted Content</a></li>
<li><a href="https://github.com/docker/roadmap" target="_blank" rel="noopener">Docker Product Roadmap</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-3 col-md-3">
<ul class="footer_links">
<li><b><a href="https://www.docker.com/products/docker-desktop" target="_blank" rel="noopener">Developers</a></b></li>
<li><a href="https://www.docker.com/use-cases" target="_blank" rel="noopener">Use Cases</a></li>
<li><a href="/get-started/" target="_blank" rel="noopener">Get Started</a></li>
<li><a href="https://www.docker.com/blog/" target="_blank" rel="noopener">Blog</a></li>
<li><a href="https://www.docker.com/docker-community" target="_blank" rel="noopener">Community</a></li>
<li><a href="https://www.docker.com/open-source" target="_blank" rel="noopener">Open Source</a></li>
<li><a href="https://www.docker.com/community/get-involved/developer-preview" target="_blank" rel="noopener">Preview Program</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-3 col-md-3">
<ul class="footer_links">
<li><b><a href="https://www.docker.com/products/docker-desktop" target="_blank" rel="noopener">Pricing</a></b></li>
<li><a href="https://www.docker.com/pricing/faq" target="_blank" rel="noopener">FAQ</a></li>
<li><a href="https://www.docker.com/partners/programs" target="_blank" rel="noopener">Docker Verified Publisher</a></li>
<li><a href="https://www.docker.com/partners" target="_blank" rel="noopener">Partners</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-3 col-md-3">
<ul class="footer_links">
<li><b><a href="https://www.docker.com/company" target="_blank" rel="noopener">About Us</a></b></li>
<li><a href="https://www.docker.com/what-container" target="_blank" rel="noopener">What is a Container?</a></li>
<li><a href="https://www.docker.com/why-docker" target="_blank" rel="noopener">Why Docker?</a></li>
<li><a href="https://www.docker.com/events" target="_blank" rel="noopener">Virtual Events</a></li>
<li><a href="https://www.docker.com/swag" target="_blank" rel="noopener">Swag Store
</a></li>
<li><a href="https://www.docker.com/company/newsroom" target="_blank" rel="noopener">Newsroom</a></li>
<li><a href="https://www.docker.com/careers" target="_blank" rel="noopener">Careers</a></li>
<li><a href="https://www.docker.com/company/contact" target="_blank" rel="noopener">Contact Us</a></li>
<li><a href="https://www.docker.com/customers" target="_blank" rel="noopener">Customers</a></li>
<li><a href="https://www.docker.com/newsletter-subscription" target="_blank" rel="noopener">Newsletter</a></li>
</ul>
</div>
</div>
<div class="footer-nav">
<nav class="footer_sub_nav">
<ul class="menu">
<li><a href="https://www.docker.com/legal/docker-terms-service" target="_blank" rel="noopener">Terms of Service</a></li>
<li><a href="https://dockerstatus.com/" target="_blank" rel="noopener">Status</a></li>
<li><a href="https://www.docker.com/legal" target="_blank" rel="noopener">Legal</a></li>
</ul>
</nav>
</div>
</div>
<div class="bottom_footer">
<div class="footer-copyright col-xs-12 col-md-8">
<p class="copyright">
Copyright &copy; 2013-{{ site.time | date: '%Y' }} Docker Inc. All rights reserved.
</p>
{%- if jekyll.environment == 'production' and site.onetrust_id != '' -%}
<!-- OneTrust Cookies Settings button start -->
<button id="ot-sdk-btn" class="ot-sdk-show-settings">Cookie Settings</button>
<!-- OneTrust Cookies Settings button end -->
{%- endif -%}
</div>
<div class="footer_social_nav">
<ul class="nav-social">
<li class="fa-brands fa-twitter"><a href="https://twitter.com/docker">Twitter</a></li>
<li class="fa-brands fa-youtube"><a href="https://www.youtube.com/user/dockerrun">Youtube</a></li>
<li class="fa-brands fa-github"><a href="https://github.com/docker">GitHub</a></li>
<li class="fa-brands fa-linkedin-in"><a href="https://www.linkedin.com/company/docker">Linkedin</a></li>
<li class="fa-brands fa-facebook-f"><a href="https://www.facebook.com/docker.run">Facebook</a></li>
<li class="fa-brands fa-slideshare"><a href="https://www.slideshare.net/docker">Slideshare</a></li>
<li class="fa-brands fa-reddit-alien"><a href="https://www.reddit.com/r/docker">Reddit</a></li>
</ul>
</div>
</div>
</div>

View File

@ -1,12 +0,0 @@
{% comment %}
Generates a Github PR URL from three parameters
Usage:
{% include github-pr.md org=docker repo=docker pr=12345 %}
If you omit the org or repo, they default to docker.
If you omit the pr, it defaults to NULL.
Output:
[#12345](https://github.com/moby/moby/pull/12345)
{% endcomment %}{% assign org = include.org | default: "docker" %}{% assign repo = include.repo | default: "docker" %}{% assign pr = include.pr | default: NULL %}{% assign github-url="https://github.com" %}{% capture pr-link %}[#{{ pr }}]({{ github-url }}/{{ org }}/{{ repo }}/pull/{{ pr }}){% endcapture %}{{ pr-link | strip_newlines }}

View File

@ -1,119 +0,0 @@
{%- if page.title == nil -%}
{%- comment -%}
# This is a very hacky way to extract the page title from pages that do not have
# front-matter yaml, but have a H1 header. We need to take (id-) attributes into
# account, so some hacking is needed. Taking the following example:
# <h1 id="docker-run-reference">Docker run reference</h1>
#
# a. split on '<h1', which gives us ['content before', '<h1 id="docker-run-reference">Docker run reference</h1>']
# b. split the last element on '</h1', which gives us ['<h1 id="docker-run-reference">Docker run reference', '</h1', '>']
# c. split the first element on '>', which gives us ['<h1 id="docker-run-reference"', '>', 'Docker run reference']
{%- endcomment -%}
{%- assign a = content | split: '<h1' | last -%}
{%- assign b = a | split: '</h1' | first -%}
{%- assign c = b | split: '>' | last -%}
{%- assign page_title = c | strip_html | strip | truncatewords: 10 | escape_once -%}
{%- endif -%}
{%- if page.description == nil and page.datafile != nil and page.datafile != '' -%}
{%- assign yaml_data = site.data[page.datafolder][page.datafile] -%}
{%- if yaml_data.long and yaml_data.long != '' -%}
{%- assign page_description = page.title | append: ': ' | append: yaml_data.long | strip_html | strip | truncatewords: 30 -%}
{%- elsif yaml_data.short and yaml_data.short != '' -%}
{%- assign page_description = page.title | append: ': ' | append: yaml_data.short | strip_html | strip | truncatewords: 30 -%}
{%- else -%}
{%- assign page_description = content | strip_html | strip | truncatewords: 30 -%}
{%- endif -%}
{%- endif -%}
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
{%- if page.sitemap == false or jekyll.environment != 'production' %}
<meta name="robots" content="noindex"/>
{%- endif %}
{%- if jekyll.environment == 'production' -%}
{%- if site.onetrust_id != '' -%}{%- include analytics/onetrust.html ONETRUST_ID=site.onetrust_id -%}{%- endif -%}
{%- if site.google_analytics != '' -%}{%- include analytics/google_analytics.html GOOGLE_ID=site.google_analytics -%}{%- endif -%}
{%- endif -%}
<title>{{ page.title | default: page_title }} | Docker Documentation</title>
<meta name="description" content="{{ page.description | default: page_description | escape}}" />
<meta name="keywords" content="{{ page.keywords | default: 'docker, docker open source, docker platform, distributed applications, microservices, containers, docker containers, docker software, docker virtualization' }}">
<link rel="canonical" href="{{ site.docs_url }}{{ page.url }}" />
<!-- favicon -->
<link rel="icon" type="image/x-icon" href="/assets/favicons/docs@2x.ico" sizes="129x128">
<link rel="apple-touch-icon" type="image/x-icon" href="/assets/favicons/docs@2x.ico" sizes="129x128">
<meta name="msapplication-TileImage" content="/assets/favicons/docs@2x.ico">
<meta property="og:image" content="/assets/favicons/docs@2x.ico"/>
<meta name="theme-color" content="#2496ed" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- hide elements that are only shown without JavaScript enabled -->
<script>document.documentElement.classList.add('js')</script>
<style>html.js .no-js { display: none !important; }</style>
{%- comment -%}
We put these scripts in the head section, but use "defer" loading to allow the
browser to start loading them as soon as possible. Actual execution of deferred
scripts happens once the HTML is fully parsed.
see https://flaviocopes.com/javascript-async-defer/#with-defer-in-the-head
{%- endcomment -%}
{%- if page.layout == 'landing' -%}
<!-- landing page scripts -->
<script defer src="/assets/js/theme-switcher.js"></script>
<script defer src="/assets/jquery/jquery.js"></script>
<script defer src="/assets/bootstrap/js/bootstrap.min.js"></script>
{%- else -%}
<script defer src="/assets/js/theme-switcher.js"></script>
<script defer src="/assets/js/anchorlinks.js"></script>
<script defer src="/assets/jquery/jquery.js"></script>
<script defer src="/assets/bootstrap/js/bootstrap.min.js"></script>
<script defer src="/assets/js/docs.js"></script>
<script defer src="/assets/js/copy.js"></script>
<script defer src="/assets/js/modal.js"></script>
{%- endif -%}
{%- if site.local_search -%}
<script defer src="/assets/js/search.js"></script>
{%- endif -%}
{%- include analytics/feedback.html -%}
{% include mermaid.html %}
{%- comment -%}
preload fonts: https://www.freecodecamp.org/news/web-fonts-in-2018-f191a48367e8/
we only preload the "woff2" variants, as older formats (woff, eot) are only used
by older browsers, and we don't optimize for those.
{%- endcomment -%}
<link rel="preload" as="font" href="https://fonts.gstatic.com/s/opensans/v18/mem8YaGs126MiZpBA-UFVZ0bf8pkAg.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/fontawesome/webfonts/fa-brands-400.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/fontawesome/webfonts/fa-regular-400.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/fontawesome/webfonts/fa-solid-900.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/fontawesome/webfonts/fa-v4compatibility.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/fonts/geomanist/hinted-Geomanist-Book.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/fonts/geomanist/hinted-Geomanist-Regular.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="preload" as="font" href="/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2" type="font/woff2" crossorigin="anonymous">
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="/assets/css/style.css" id="pagestyle">
<!-- SEO stuff -->
<meta name="twitter:title" itemprop="title name" content="{{ page.title | default: page_title }}"/>
<meta name="twitter:description" property="og:description" itemprop="description" content="{{ page_description | escape_once }}" />
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:domain" content="{{ site.docs_url | replace_first: 'http://', '' | replace_first: 'https://', '' }}"/>
<meta name="twitter:site" content="@docker_docs"/>
<meta name="twitter:url" content="https://twitter.com/docker_docs"/>
<meta name="twitter:image:src" content="{{ site.docs_url }}/assets/images/docs@2x.png"/>
<meta name="twitter:image:alt" content="Docker Documentation"/>
<meta property="og:title" content="{{ page.title | default: page_title }}" />
<meta property="og:description" content="{{ page.description | default: page_description | escape_once }}" />
<meta property="og:type" content="website"/>
<meta property="og:updated_time" itemprop="dateUpdated" content="{% if page.date %}{{ page.date | date_to_xmlschema }}{% else %}{{ site.time | date_to_xmlschema }}{% endif %}"/>
<meta property="og:image" itemprop="image primaryImageOfPage" content="{{ site.docs_url }}/assets/images/docs@2x.png"/>
<meta property="og:locale" content="en_US" />
<meta property="og:url" content="{{ site.docs_url }}{{ page.url }}" />
<meta property="og:site_name" content="Docker Documentation" />
<meta property="article:published_time" itemprop="datePublished" content="{% if page.date %}{{ page.date | date_to_xmlschema }}{% else %}{{ site.time | date_to_xmlschema }}{% endif %}"/>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","headline":{{ page.title | default: page_title | jsonify }},"description":{{ page.description | default: page_description | jsonify }},"url":"{{ site.docs_url }}{{ page.url }}"}</script>
<!-- END SEO STUFF -->
</head>

View File

@ -1,13 +0,0 @@
<nav class="nav-secondary navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<a href="/">
<img class="logo" src="/assets/images/docker-docs-logo.svg" alt="Docker Docs" title="Docker Docs" width="160" height="28" />
</a>
</div>
<div class="navbar-collapse" aria-expanded="false" style="height: 1px;">
{% include navigation.html %}
{%- include breadcrumbs.html -%}
</div>
</div>
</nav>

View File

@ -1,5 +0,0 @@
<div id="img-modal1" class="modal1">
<span class="close1" id="img-modal-close1">&times;</span>
<img src="/" alt="/" class="modal-content1" id="img-modal-img1">
<div id="img-modal-caption1"></div>
</div>

View File

@ -1,21 +0,0 @@
<section class="cta-banner slack">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>Docker Community All Hands</h2>
<h5>
Join us in celebrating Dockers 9th birthday at our next Community All
Hands on Thursday, March 31, 2022. This virtual event is a
unique opportunity for the community to come together with Docker
staff to
learn, share and collaborate about all things Docker.
</h5>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="https://www.docker.com/event-community-all-hands" target="_blank" rel="noopener">
Register now
</a>
</div>
</div>
</div>
</section>

View File

@ -1,19 +0,0 @@
<section class="cta-banner">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>
Docker Dev Environments
</h2>
<h5>
We are excited to announce the release of the Tech Preview of Dev Environments as part of Docker Desktop 3.5.0. Docker Dev Environments let you share your work-in-progress code for faster, higher-quality collaboration in just one click.
</h5>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="/desktop/dev-environments/" target="_blank" rel="noopener">
Check out the details
</a>
</div>
</div>
</div>
</section>

View File

@ -1,37 +0,0 @@
<div class="col-xs-12 col-lg-4 card-holder">
<div class="cardlet container-fluid">
<div class="row">
<div class="col-xs-12">
<h5 class="title">Develop with Docker</h5>
<p>Learn how to develop language-specific apps using Docker.</p>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-12">
<a href="https://github.com/docker/labs/tree/master/developer-tools/java/" target="_blank">
Docker for Java developers
</a>
</div>
<div class="col-xs-12 col-md-6 col-lg-12">
<a href="https://github.com/docker/labs/tree/master/developer-tools/nodejs/porting/" target="_blank">
Port a node.js app to Docker
</a>
</div>
<div class="col-xs-12 col-md-6 col-lg-12">
<a href="https://github.com/docker/labs/tree/master/developer-tools/ruby" target="_blank">
Ruby on Rails app on Docker
</a>
</div>
<div class="col-xs-12 col-md-6 col-lg-12">
<a href="/languages/dotnet/">
Dockerize a .Net Core application
</a>
</div>
<div class="col-xs-12 col-md-6 col-lg-12">
<a href="https://github.com/docker/awesome-compose/tree/master/aspnet-mssql" target="_blank">
ASP.NET Core application with SQL Server
</a>
</div>
</div>
</div>
</div>

View File

@ -1,19 +0,0 @@
<section class="cta-banner">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>
Share and Collaborate with Docker Hub
</h2>
<h5>
The world's leading service for finding and sharing container images with your team and the Docker community.
</h5>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="https://hub.docker.com/" target="_blank" class="card">
Sign up for free
</a>
</div>
</div>
</div>
</section>

View File

@ -1,19 +0,0 @@
<section class="cta-banner">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>
Docker updates subscription model to deliver scale, speed, and security
</h2>
<h5>
The updated Docker subscription tiers deliver the productivity and collaboration developers rely on, paired with the security and trust businesses demand. Docker subscription tiers now include Personal, Pro, Team, and Business.
</h5>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="/subscription/" target="_blank" rel="noopener">
Learn more
</a>
</div>
</div>
</div>
</section>

View File

@ -1,19 +0,0 @@
<section class="cta-banner dockercon">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<img src="/assets/images/dockercon.png" alt="dockercon" />
<h2>
DockerCon 2022 On-Demand
</h2>
</br>
<p>With over 50 sessions for developers by developers, watch the latest developer news, trends, and announcements from DockerCon 2022. From the keynote to product demos to technical breakout sessions, hacks, and tips & tricks, theres something for everyone.</p>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="http://www.docker.com/dockercon" target="_blank">
Watch Now
</a>
</div>
</div>
</div>
</section>

View File

@ -1,21 +0,0 @@
<section class="cta-banner dockercon">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<img src="/assets/images/dockercon21.png" alt="dockercon" />
<h2>
Thank you for attending DockerCon21!
</h2>
<h5>
You can now watch the sessions you missed and share your favorites with your friends and colleagues.
</h5>
</br>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="https://docker.events.cube365.net/dockercon-live/2021" target="_blank" class="card">
Watch the recordings
</a>
</div>
</div>
</div>
</section>

View File

@ -1,19 +0,0 @@
<section class="cta-banner extensions">
<div class="container">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>
Build your own Docker Extension
</h2>
</br>
<p>Use our SDK to build new functionality into Docker Desktop, extend its existing capabilities, and integrate additional developer tools. <br><br> Create and install an extension today and join our growing list of Extension Partners when you publish your extension to the Marketplace.</p>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<img src="/assets/images/extensions.PNG" alt="extensions" />
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="/desktop/extensions-sdk/" target="_blank">
Start building
</a>
</div>
</div>
</section>

View File

@ -1,19 +0,0 @@
<section class="cta-banner desktop">
<div class="container">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>
Hardened Docker Desktop for Docker Business customers
</h2>
</br>
<p>Two new security features have been introduced for Docker Business users, Settings Management and Enhanced Container Isolation, as part of Docker Desktops new security model.</p>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<img src="/assets/images/hardened-desktop.PNG" alt="extensions" />
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="/desktop/hardened-desktop/" target="_blank">
Learn more
</a>
</div>
</div>
</section>

View File

@ -1,30 +0,0 @@
<div class="col-xs-12 col-lg-4 card-holder">
<div class="cardlet container-fluid">
<div class="row">
<div class="col-xs-12">
<h5 class="title">Popular videos</h5>
<p>Watch the most popular videos from DockerCon.</p>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-12">
<a class="video-item" href="https://youtu.be/gAGEar5HQoU" target="_blank" rel="noopener">
<img class="video-image" src="/assets/images/video.svg" alt="video: How to get started with Docker" width="65" height="44" />
<div class="video-title">How to get started with Docker</div>
</a>
</div>
<div class="col-xs-12 col-md-6 col-lg-12">
<a class="video-item" href="https://youtu.be/xmLVNpyJ530?t=30" target="_blank" rel="noopener">
<img class="video-image" src="/assets/images/video.svg" alt="video: How to build and test your Docker images in the Cloud" width="65" height="44" />
<div class="video-title">How to build and test your Docker images in the Cloud</div>
</a>
</div>
<div class="col-xs-12 col-md-6 col-lg-12">
<a class="video-item" href="https://youtu.be/QeQ2MH5f_BE?t=31" target="_blank" rel="noopener">
<img class="video-image" src="/assets/images/video.svg" alt="video: Simplify all the things with Docker Compose" width="65" height="44" />
<div class="video-title">Simplify all the things with Docker Compose</div>
</a>
</div>
</div>
</div>
</div>

View File

@ -1,19 +0,0 @@
<section class="cta-banner">
<div class="container">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-offset-1 col-lg-7">
<h2>
Volume Management is now free in Docker Desktop 4.1
</h2>
<h5>
Thanks for your positive support on the <a href="https://www.docker.com/blog/updating-product-subscriptions/" target="_blank" rel="noopener" id="dkr_docs_subscription_btl">Docker subscription updates</a>. We are now able to deliver more value to all users, starting with making Volume Management available for users on any subscription, including Docker Personal. Update your Docker Desktop to version 4.1 or later to start managing your volumes.
</h5>
</div>
<div class="col-xs-12 col-md-6 col-lg-4 text-center">
<a class="btn" href="/desktop/use-desktop/volumes/" target="_blank" rel="noopener">
Learn more
</a>
</div>
</div>
</div>
</section>

View File

@ -1,7 +0,0 @@
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
mermaid.initialize({ startOnLoad: false });
await mermaid.run({
querySelector: '.language-mermaid',
});
</script>

View File

@ -1,33 +0,0 @@
<div class="logo-mobile">
<a href="/">
<img src="/assets/images/docker-icon.svg" alt="Docker Docs" title="Docker Docs" width="30" height="30" />
</a>
</div>
<div class="search-form" id="search-div">
<form class="search-form form-inline" id="searchForm" action="/search/" method="get">
<label for="st-search-input" class="sr-only">Search</label>
<input data-hj-allow class="search-field form-control ds-input" id="st-search-input" name="q" placeholder="Search the docs" type="search" autocomplete="off" spellcheck="false" dir="auto" style="position: relative; vertical-align: top;">
<div id="autocompleteResults"></div>
<!-- <button type="submit" class="search-submit btn btn-default">Search</button> -->
</form>
</div>
<div class="sidebar-toggle">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="nav-container hidden-sm hidden-xs">
<div>
<ul class="nav navbar-nav">
{%- for entry in site.data.toc.horizontalnav -%}
<li><a href="{{ entry.path }}" id="{{ entry.node }}">{{ entry.title }}</a></li>
{%- endfor -%}
</ul>
</div>
<div class="ctrl-right">
<a href="javascript:void(0)" id="menu-toggle" aria-label="Current page's menu toggle"><i class="fa fa-indent" aria-hidden="true"></i></a>
</div>
</div>

View File

@ -1 +0,0 @@
<em class="release-date">{{ include.date }}</em>

View File

@ -1,14 +0,0 @@
<div class="toggle-mode">
<div class="icon">
<i class="fa fa-sun" aria-hidden="true"></i>
</div>
<div class="toggle-switch">
<label class="switch">
<input type="checkbox" id="switch-style">
<span class="slider round"></span>
</label>
</div>
<div class="icon">
<i class="fa fa-moon" aria-hidden="true"></i>
</div>
</div>

View File

@ -1,68 +0,0 @@
{% capture tocWorkspace %}
{% comment %}
"...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe
Usage:
{% include toc_pure_liquid.html html=content sanitize=true class="inline_toc" id="my_toc" toc_min=2 toc_max=3 %}
Variables:
* html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
* sanitize (bool) - when set to true, the headers will be sanitized in the TOC
* class (string) - a CSS class assigned to the TOC
* id (string) - an ID to assigned to the TOC
* toc_min (int) - the minimum TOC header level to use (if not set, check page, then site, then default to 2)
* toc_max (int) - the maximum TOC header level to use (if not set, check page, then site, then default to 3)
Output:
An unordered list representing the table of contents of a markdown block. This snippet will only generate the table of contents and will NOT output the markdown given to it
{% endcomment %}
{% capture my_toc %}{% endcapture %}
{% assign minHeader = include.toc_min | default: 2 %}
{% assign maxHeader = include.toc_max | default: 3 %}
{% assign nodes = include.html | split: '<h' %}
{% for node in nodes %}
{% if node == "" %}
{% continue %}
{% endif %}
{% assign headerLevel = node | replace: '"', '' | slice: 0, 1 %}
{% assign headerLevel = headerLevel | times: 1 %}
{% assign indentAmount = headerLevel | minus: minHeader | add: 1 %}
{% assign _workspace = node | split: '</h' %}
{% unless headerLevel >= minHeader %}
{% continue %}
{% endunless %}
{% if headerLevel > maxHeader %}
{% continue %}
{% endif %}
{% assign _idWorkspace = _workspace[0] | split: '"' %}
{% assign html_id = _idWorkspace[1] %}
{% capture _hAttrToStrip %}{{ headerLevel }} id="{{ html_id }}">{% endcapture %}
{% assign header = _workspace[0] | replace: _hAttrToStrip, '' | remove_first: "1>" %}
{% assign space = '' %}
{% for i in (1..indentAmount) %}
{% assign space = space | prepend: ' ' %}
{% endfor %}
{% capture my_toc %}{{ my_toc }}
{{ space }}- [{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}](#{{ html_id }}){: class="nomunge" }{% endcapture %}
{% endfor %}
{% if include.class %}
{% capture my_toc %}{:.{{ include.class }}}
{{ my_toc | lstrip }}{% endcapture %}
{% endif %}
{% if include.id %}
{% capture my_toc %}{: #{{ include.id }}}
{{ my_toc | lstrip }}{% endcapture %}
{% endif %}
{% endcapture %}{% assign tocWorkspace = '' %}
{{ my_toc | markdownify }}

View File

@ -1,9 +0,0 @@
<div class="docker-upgrade-cta" role="alert">
<div class="docker-upgrade-cta__heading">{{include.header-text}}</div>
{{ include.body | markdownify }}
<a class="btn btn-primary" role="button" href="{{include.target-url}}" target="_blank">
Upgrade now
</a>
</div>

View File

@ -1,14 +0,0 @@
---
layout: docs
---
<html>
<head><title>{{ page.prod_title }}</title></head>
<body>
<h1>{{ page.prod_title }}</h1>
<p>You are viewing an archive branch of the
<a href="/">Docker documentation</a>, but
{{ prod_title }} documentation is not published in the current archive.
<a href="/{{ page.prod_url }}/" target="_blank" rel="noopener">Go to {{ site.docs_url }}/{{ page.prod_url }}/</a>
in a new tab.</p>
</body>
</html>

View File

@ -1,98 +0,0 @@
<!DOCTYPE html>
<!-- Page generated {{ site.time }}
{%- if page.edit_url -%}
{%- assign edit_url = page.edit_url -%}
{%- else -%}
{% capture edit_url %}{{ site.repo }}/edit/main/{{ page.path }}{% endcapture %}
{%- endif -%}
{%- if page.issue_url -%}
{%- assign issue_url = page.issue_url -%}
{%- else -%}
{% capture issue_url %}{{ site.repo }}/issues/new?template=doc_issue.yml&location={{ site.docs_url }}{{ page.url }}&labels=status%2Ftriage{% endcapture %}
{%- endif -%} -->
<html lang="en">
{%- include head.html -%}
<body class="colums">
<header>
{% include header.html %}
</header>
<div class="wrapper right-open">
<div class="container-fluid">
<div class="row">
<div class="col-body">
<main class="col-content content">
<section class="section">
{%- if page.title -%}
<h1>{{ page.title }}</h1>
{%- endif -%}
{%- if page.advisory -%}
<blockquote>{{ site.data.advisories.texts[page.advisory] | markdownify }}</blockquote>
{%- endif -%}
<p></p>
{{ content }}
</section>
</main>
<nav class="col-nav">
<div id="sidebar-nav" class="sidebar hidden-sm hidden-xs">
<div id="navbar" class="nav-sidebar">
<ul class="nav hidden-md hidden-lg"></ul>
<ul class="nav" id="jsTOCLeftNav"></ul>
</div>
</div>
</nav>
<div class="col-toc">
<div class="sidebar hidden-xs hidden-sm">
<div class="toc-nav">
<div class="feedback-links">
<ul>
<li>{%- include theme-switch.html -%}</li>
</ul>
</div>
{%- unless page.notoc -%}
{%- assign my_min = page.toc_min | default: site.toc_min | default: 2 -%}
{%- assign my_max = page.toc_max | default: site.toc_max | default: 3 -%}
{%- assign my_name = page.url | default: "unnamed" -%}
<div id="side-toc-title">Contents:</div>
{% include image-modal.html %}
<div class="side-toc-title">Page details</div>
<div class="metadata-items">
<ul>
{%- unless page.skip_read_time == true %}{% assign words = content | number_of_words %}{% if words >= 360 -%}
<li title="Estimated reading time"><i class="fa fa-clock" aria-hidden="true"></i> {{ words | divided_by:180 }} minute read</span></li>
{%- endif %}{% endunless -%}
{%- if edit_url != "" -%}
<li><a href="{{ edit_url }}"><i class="fa fa-pencil" aria-hidden="true"></i> Edit this page</a></li>
{%- endif -%}
{%- if issue_url != "" -%}
<li><a href="{{ issue_url }}" class="nomunge"><i class="fa fa-check" aria-hidden="true"></i> Request changes</a></li>
{%- endif -%}
</ul>
</div>
{%- unless page.notags == true -%}
{%- assign keywords = page.keywords | split:"," -%}
{%- if keywords.size > 0 -%}
<div class="side-toc-title">Tags</div>
<div class="keywords-items">
{%- for keyword in keywords -%}
{%- assign strippedKeyword = keyword | strip -%}
<a href="/search/?q={{ strippedKeyword }}" class="nomunge"><i class="fa fa-tag" aria-hidden="true"></i> {{ strippedKeyword }}</a>
{%- endfor -%}
</div>
{%- endif -%}
{%- endunless %}
<div class="side-toc-title">Contents</div>
{%- include toc_pure_liquid.html html=content sanitize=true class="inline_toc" id="my_toc" toc_min=my_min toc_max=my_max page_name=my_name -%}
{%- endunless -%}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
{% include footer.html %}
</footer>
<script>const pageURL = "{{ page.url }}";</script>
</body>
</html>

View File

@ -1,22 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Docker Engine API {{ page.name | replace: '.md' }} Reference</title>
<!-- needed for adaptive design -->
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Reference documentation and Swagger (OpenAPI) specification for the v{{ page.name | replace: '.md' }} version of the API served by Docker Engine." />
<meta charset="utf-8" />
<!-- favicon -->
<meta name="msapplication-TileImage" content="/assets/favicons/docs@2x.ico" />
<meta property="og:image" content="/assets/favicons/docs@2x.ico" />
<link rel="apple-touch-icon" type="image/x-icon" href="/assets/favicons/docs@2x.ico" sizes="129x128" />
<link rel="icon" type="image/x-icon" href="/assets/favicons/docs@2x.ico" sizes="129x128" />
<link rel="stylesheet" type="text/css" href="/assets/css/api-reference.css" />
<!-- make the latest API version the canonical page as that's what we want users to be using mostly -->
<link rel="canonical" href="{{ site.docs_url }}/engine/api/v{{ site.latest_engine_api_version }}/" />
</head>
<body>
<redoc spec-url="/engine/api/{{ page.name | replace: '.md'}}.yaml" hide-hostname="true" suppress-warnings="true" lazy-rendering></redoc>
<script src="/assets/redoc/redoc.standalone.js"></script>
</body>
</html>

View File

@ -1,22 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Docker Hub API Reference - {{ page.name | replace: '.md' }}</title>
<!-- needed for adaptive design -->
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Reference documentation and Swagger (OpenAPI) specification for the {{ page.name | replace: '.md' }} API served by Docker Hub." />
<meta charset="utf-8" />
<!-- favicon -->
<meta name="msapplication-TileImage" content="/assets/favicons/docs@2x.ico" />
<meta property="og:image" content="/assets/favicons/docs@2x.ico" />
<link rel="apple-touch-icon" type="image/x-icon" href="/assets/favicons/docs@2x.ico" sizes="129x128" />
<link rel="icon" type="image/x-icon" href="/assets/favicons/docs@2x.ico" sizes="129x128" />
<link rel="stylesheet" type="text/css" href="/assets/css/api-reference.css" />
<!-- make the latest API version the canonical page as that's what we want users to be using mostly -->
<link rel="canonical" href="{{ site.docs_url }}/docker-hub/api/latest/" />
</head>
<body>
<redoc spec-url="/docker-hub/api/{{ page.name | replace: '.md'}}.yaml" class="hub-api"></redoc>
<script src="/assets/redoc/redoc.standalone.js"></script>
</body>
</html>

View File

@ -1,491 +0,0 @@
<!DOCTYPE html>
<!-- Page generated {{ site.time }} -->
<html lang="en">
{%- include head.html -%}
<body id="landing" class="landing">
<nav class="navbar header">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#header-content" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<img src="/assets/images/docker-docs-logo.svg" alt="Docker Docs" title="Docker Docs" width="160" height="28" />
</a>
</div>
<div class="collapse navbar-collapse" id="header-content">
<ul class="nav navbar-nav">
{%- for entry in site.data.toc.horizontalnav -%}
{%- if entry.hide_home -%}{% continue %}{%- endif -%}
<li{% if entry.node == "home" %} class=active{% endif %}><a href="{{ entry.path }}" id="{{ entry.node }}">{{ entry.title }}</a></li>
{%- endfor -%}
<li><a href="/contribute/overview/">Contribute</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>{% include theme-switch.html %}</li>
</ul>
</div>
</div>
</nav>
<section class="hero container">
<div class="row justify-content-center">
<div class="col-xs-12 text-center">
<h2>What can we help you find?</h2>
</div>
</div>
<div class="row justify-content-center">
<form action="/search/" method="get" class="col-xs-12 col-sm-offset-2 col-sm-8 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6">
<label class="sr-only" for="st-search-input">Search</label>
<input
id="st-search-input"
class="form-control"
name="q"
placeholder="Search for guides, terms, commands and more..."
type="search"
autocomplete="off"
spellcheck="false"
dir="auto"
autofocus
data-hj-allow
/>
<div id="autocompleteResults"></div>
</form>
</div>
</section>
<section class="container">
<div class="row">
<div class="col-xs-12 col-sm-6 col-lg-4 card-holder">
<a class="card rocket" href="/get-started/">
<h5 class="title">Get started</h5>
<p>
Learn Docker basics and the benefits of containerizing your
applications.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-lg-4 card-holder">
<a class="card download-docker" href="/get-docker/">
<h5 class="title">Download and install</h5>
<p>
Download and install Docker on your machine in a few easy steps.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-lg-4 card-holder">
<a class="card guides" href="/get-started/overview/">
<h5 class="title">Guides</h5>
<p>
Learn how to set up your Docker environment and start containerizing
your applications.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-lg-4 card-holder">
<a class="card language-guides" href="/language/">
<h5 class="title">Language-specific guides</h5>
<p>
Learn how to containerize language-specific applications using Docker.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-lg-4 card-holder">
<a class="card manuals" href="/desktop/">
<h5 class="title">Manuals</h5>
<p>
Browse through the manuals and learn how to use Docker products.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-lg-4 card-holder">
<a class="card reference" href="/reference/">
<h5 class="title">Reference</h5>
<p>
Browse through the CLI and API reference documentation.
</p>
</a>
</div>
</div>
</section>
<section class="container tab-section">
<div class="row">
<div class="col-xs-12 col-lg-8 card-holder">
<div class="cardlet container-fluid" style="min-height:317px">
<div class="row">
<div class="col-xs-12 col-lg-8">
<h5 class="title"></h5>
</div>
</div>
<div class="row">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" data-target="#includes">Explore Docker</a></li>
<li><a data-toggle="tab" data-target="#faqs">Browse FAQs</a></li>
<li><a data-toggle="tab" data-target="#features">Get support</a></li>
</ul>
<div class="tab-content">
<div id="includes" class="tab-pane fade in active" markdown="1">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-6">
<p><a href="/engine/reference/builder/">Write a Dockerfile</a></p>
<p><a href="/network/">Manage container networking</a></p>
<p><a href="/compose/compose-file/">Write a Docker Compose file</a></p>
<p><a href="/storage/">Work with volumes and bind mounts</a></p>
<p><a href="/get-started/04_sharing_app/">Share my image on Docker Hub</a></p>
</div>
<div class="col-xs-12 col-md-6 col-lg-6">
<p><a href="/config/daemon/">Configure the Docker daemon</a></p>
<p><a href="/get-started/02_our_app/">Build and run an image</a></p>
<p><a href="/config/labels-custom-metadata/">Manage Docker objects</a></p>
<p><a href="/build/building/multi-stage/">Multi-stage builds</a></p>
</div></div></div>
<div id="features" class="tab-pane fade" markdown="1">
<p><a href="/support/">Get support</a></p>
<p><a href="https://dockercommunity.slack.com/"target="_blank" rel="noopener">Docker community Slack</a></p>
<p><a href="https://www.docker.com/company/contact/"target="_blank" rel="noopener">Contact Docker</a></p>
</div>
<div id="faqs" class="tab-pane fade" markdown="1">
<div class="row">
<div class="col-xs-12 col-md-6 col-lg-6">
<h6 style="margin-top: 0;">Common FAQs</h6>
<p><a href="/desktop/faqs/general/#what-are-the-system-requirements-for-docker-desktop">What are the system requirements for Docker Desktop?</a></p>
<p><a href="https://github.com/docker/awesome-compose" target="_blank" rel="noopener">Where can I find example Compose files?</a></p>
<p><a href="/desktop/faqs/general/#how-do-i-connect-from-a-container-to-a-service-on-the-host">How do I connect from a container to a service?</a></p>
<p><a href="/get-started/04_sharing_app/">How do I share images on Docker Hub?</a></p>
</div>
<div class="col-xs-12 col-md-6 col-lg-6">
<h6 style="margin-top: 0;">Products</h6>
<p><a href="/desktop/faqs/general/">Docker Desktop</a></p>
<p><a href="/desktop/faqs/macfaqs/">Docker Desktop for Mac</a></p>
<p><a href="/desktop/faqs/windowsfaqs/">Docker Desktop for Windows</a></p>
<p><a href="/desktop/faqs/linuxfaqs/">Docker Desktop for Linux</a></p>
<p><a href="/single-sign-on/faqs/">Docker Single Sign-on</a></p>
</div></div></div></div>
</div>
</div>
</div>
{% include landing-page/popular-videos.html %}
</div>
</section>
{% include landing-page/hardened-desktop.html %}
<section class="container help-by-product tab-section">
<div class="row">
<div class="col-xs-12">
<div class="cardlet container-fluid">
<div class="row">
<div class="col-xs-12">
<h5 class="title">Help by product</h5>
</div>
<div class="col-xs-12">
<ul class="nav nav-tabs">
<li class="active" role="presentation" data-tab="desktop">
<a onclick="onChangeHelpTab('desktop')">Desktop</a>
</li>
<li role="presentation" data-tab="engine">
<a onclick="onChangeHelpTab('engine')">Engine</a>
</li>
<li role="presentation" data-tab="build">
<a onclick="onChangeHelpTab('build')">Build</a>
</li>
<li role="presentation" data-tab="compose">
<a onclick="onChangeHelpTab('compose')">Compose</a>
</li>
<li role="presentation" data-tab="hub">
<a onclick="onChangeHelpTab('hub')">Hub</a>
</li>
</ul>
</div>
</div>
<!-- DESKTOP -->
<div class="row active" data-tab="desktop" data-os="win">
<div class="col-xs-12 col-md-4 col-lg-2 text-center">
<div class="image" style="background-image: url(/assets/images/laptop.svg);"></div>
<h5>Docker Desktop</h5>
<div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="os-label only-win">Windows</span>
<span class="os-label only-mac">Mac</span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a onclick="onChangeHelpOs('win')">Windows</a></li>
<li><a onclick="onChangeHelpOs('mac')">Mac</a></li>
</ul>
</div>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h4>Getting Started with Docker Desktop</h4>
<p>
Take a walkthrough that covers writing your first app, data
storage, networking, and swarms, and ends with your app running
on production servers in the cloud.
</p>
<p>
<a href="/get-started/">Learn Docker</a>
</p>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h6>Popular articles</h6>
<p class="only-win"><a href="/desktop/windows/wsl/">Docker Desktop WSL 2 backend</a></p>
<p class="only-mac"><a href="/desktop/install/mac-install/">Install Docker Desktop on Mac</a></p>
<p><a href="/desktop/use-desktop/">Docker Desktop Dashboard</a></p>
<p class="only-win"><a href="/desktop/kubernetes/">Deploy on Kubernetes</a></p>
<p class="only-win"><a href="/desktop/windows/release-notes/">Release notes</a></p>
<p class="only-win"><a href="/desktop/windows/troubleshoot/">Logs and troubleshooting</a></p>
<p class="only-mac"><a href="/desktop/mac/networking/">Networking features in Docker Desktop</a></p>
</div>
</div>
<!-- ENGINE -->
<div class="row" data-tab="engine">
<div class="col-xs-12 col-md-4 col-lg-2 text-center">
<div class="image" style="background-image: url(/assets/images/engine.svg);"></div>
<h5>Engine</h5>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h4>Getting Started with Docker Engine</h4>
<p>
Take a walkthrough that covers writing your first app, data
storage, networking, and swarms, and ends with your app running
on production servers in the cloud.
</p>
<p><a href="/get-started/">Learn Docker</a></p>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h6>Popular articles</h6>
<p><a href="/engine/install/ubuntu/">Install Docker Engine on Ubuntu</a></p>
<p><a href="/engine/reference/commandline/run/">Run a command in a container</a></p>
<p><a href="/engine/reference/builder/">Dockerfile reference</a></p>
<p><a href="/engine/reference/commandline/dockerd/#description">Docker daemon reference</a></p>
<p><a href="/engine/reference/commandline/build/">Docker build reference</a></p>
</div>
</div>
<!-- BUILD -->
<div class="row" data-tab="build">
<div class="col-xs-12 col-md-4 col-lg-2 text-center">
<div
class="image"
style="background-image: url(/assets/images/whale-car.png);"
></div>
<h5>Build</h5>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h4>Getting Started with Docker Build</h4>
<p>
Take a walkthrough that covers writing your first app, data
storage, networking, and swarms, and ends with your app running
on production servers in the cloud.
</p>
<p><a href="/get-started/">Learn Docker</a></p>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h6>Popular articles</h6>
<p><a href="/build/">Overview of Docker Build</a></p>
<p><a href="/engine/reference/builder/">Dockerfile reference</a></p>
<p><a href="/build/building/packaging/">Packaging your software</a></p>
<p><a href="/build/building/multi-stage/">Multi-stage builds</a></p>
<p><a href="/build/building/multi-platform/">Multi-platform images</a></p>
</div>
</div>
<!-- COMPOSE -->
<div class="row" data-tab="compose">
<div class="col-xs-12 col-md-4 col-lg-2 text-center">
<div
class="image"
style="background-image: url(/assets/images/Compose.png);"
></div>
<h5>Compose</h5>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h4>Getting Started with Docker Compose</h4>
<p>
Take a walkthrough that covers writing your first app, data
storage, networking, and swarms, and ends with your app running
on production servers in the cloud.
</p>
<p><a href="/get-started/">Learn Docker</a></p>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h6>Popular articles</h6>
<p><a href="/compose/install/">Install Docker Compose</a></p>
<p><a href="/compose/gettingstarted/">Getting started with Docker Compose</a></p>
<p><a href="/compose/environment-variables/">Environment variables in Compose</a></p>
<p><a href="/compose/networking/">Networking in Compose</a></p>
</div>
</div>
<!-- HUB -->
<div class="row" data-tab="hub">
<div class="col-xs-12 col-md-4 col-lg-2 text-center">
<div class="image" style="background-image: url(/assets/images/hub.svg);"></div>
<h5>Hub</h5>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h4>Getting Started with Docker Hub</h4>
<p>
Take a walkthrough that covers writing your first app, data
storage, networking, and swarms, and ends with your app running
on production servers in the cloud.
</p>
<p><a href="/get-started/">Learn Docker</a></p>
</div>
<div class="col-xs-12 col-md-4 col-lg-5">
<h6>Popular articles</h6>
<p><a href="/docker-hub/official_images/">Docker Hub official images</a></p>
<p><a href="/docker-hub/repos/">Create Docker Hub repositories</a></p>
<p><a href="/docker-hub/builds/">Set up automated builds</a></p>
<p><a href="/docker-hub/access-tokens/">Manage access tokens</a></p>
<p><a href="/docker-hub/webhooks/">Docker Hub Webhooks</a></p>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="container">
<div class="row">
<div class="col-xs-12">
<div class="container-fluid">
<div class="row">
<div class="col-xs-12 col-md-6">
<h2 class="title">Best practices</h2>
<p>
Take a look at our best practices and reference architecture
topics to fine tune your deployment.
</p>
<p><a href="/develop/develop-images/dockerfile_best-practices/">Best practices for writing Dockerfile</a></p>
<p><a href="/develop/develop-images/dockerfile_best-practices/">Best practices for writing a Docker Compose file</a></p>
<p><a href="/develop/dev-best-practices/">Docker Development best practices</a></p>
<p><a href="/engine/security/">Docker Security best practices</a></p>
</div>
<div class="col-xs-12 col-md-6">
<h2 class="title">Develop with Docker</h2>
<p>Learn how to develop language-specific apps using Docker.</p>
<p><a href="/language/nodejs/" >Containerize a Node.js app using Docker</a></p>
<p><a href="/language/python/">Containerize a Python app using Docker</a></p>
<p><a href="/language/java/">Containerize a Java app using Docker</a></p>
<p><a href="/language/golang/">Containerize a Go app using Docker</a></p>
<p><a href="/samples/">View more languages and frameworks in Docker samples</a></p>
</div>
</div>
</div>
</div>
</section>
<section id="play-with-docker" class="container">
<div class="row">
<div class="col-xs-12">
<h2 class="title">Play with Docker</h2>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="/get-started/" class="card">
<h5 class="title">Tutorial</h5>
<p>Self-paced tutorials to increase your Docker knowledge.</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="https://labs.play-with-docker.com/" class="card" target="_blank" rel="noopener">
<h5 class="title">Lab Environment</h5>
<p>
Complete a workshop without installing anything using this Docker
playground.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="/get-started/resources/" class="card">
<h5 class="title">Community Training</h5>
<p>Free and paid learning materials from Docker Captains.</p>
</a>
</div>
</div>
</section>
<section id="community-resources" class="container">
<div class="row">
<div class="col-xs-12">
<h2 class="title">Community resources</h2>
</div>
</div>
<div class="row">
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="https://www.meetup.com/pro/docker/" class="card" target="_blank" rel="noopener">
<h5 class="title">Find a local meetup</h5>
<p>Attend one of the 200+ Docker Meetups around the globe.</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="https://www.docker.com/events" class="card" target="_blank" rel="noopener">
<h5 class="title">Upcoming Events</h5>
<p>
Complete a workshop without installing anything using this Docker
playground.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="https://www.meetup.com/pro/docker/" class="card" target="_blank" rel="noopener">
<h5 class="title">Tune in Monthly</h5>
<p>
Join the Virtual Docker Meetup Group and online meetups every month.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="https://www.docker.com/newsletter-subscription" class="card" target="_blank" rel="noopener">
<h5 class="title">Community news</h5>
<p>
The Docker Weekly is a email newsletter with the latest content on
Docker and the event agenda for the upcoming weeks.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="https://www.docker.com/docker-captains" class="card" target="_blank" rel="noopener">
<h5 class="title">Meet the Captains</h5>
<p>
Select members of the community that are both experts in their field
and are passionate about sharing their Docker knowledge with others.
</p>
</a>
</div>
<div class="col-xs-12 col-sm-6 col-md-4 card-holder">
<a href="/get-started/resources/" class="card">
<h5 class="title">Educational resources</h5>
<p>
Expand your understanding of Docker with these additional resources.
</p>
</a>
</div>
</div>
</section>
<footer class="footer">
{% include footer.html %}
</footer>
<script>
window.onChangeHelpTab = function (name) {
const currentActiveTab = document.querySelector(".help-by-product ul.nav li.active");
if (currentActiveTab) currentActiveTab.classList.remove("active");
const currentActiveBody = document.querySelector(".help-by-product div.row.active[data-tab]");
if (currentActiveBody) currentActiveBody.classList.remove("active");
const nextActiveTab = document.querySelector('.help-by-product ul.nav li[data-tab="' + name + '"]');
if (nextActiveTab) nextActiveTab.classList.add("active");
const nextActiveBody = document.querySelector('.help-by-product div.row[data-tab="' + name + '"]');
if (nextActiveBody) nextActiveBody.classList.add("active");
};
window.onChangeHelpOs = function (os) {
const container = document.querySelector('div[data-tab="desktop"]');
if (container) container.setAttribute("data-os", os);
};
</script>
</body>
</html>

View File

@ -1,15 +0,0 @@
<!DOCTYPE html>
<html lang="en-US">
<meta charset="utf-8">
<title>Redirecting&hellip;</title>
{%- if page.redirect.to contains "://" %}
<link rel="canonical" href="{{ page.redirect.to }}">
{%- else %}
<link rel="canonical" href="{{ site.docs_url }}{{ page.redirect.to }}">
{%- endif %}
<meta http-equiv="refresh" content="0; url={{ page.redirect.to }}">
<meta name="robots" content="noindex">
<h1>Redirecting&hellip;</h1>
<a href="{{ page.redirect.to }}">Click here if you are not redirected.</a>
<script>location="{{ page.redirect.to }}"</script>
</html>

View File

@ -1,12 +0,0 @@
require_relative 'util.rb'
module Jekyll
class ConfigGenerator < Generator
safe true
priority :highest
def generate(site)
site.config['docs_url'] = get_docs_url
end
end
end

View File

@ -1,147 +0,0 @@
require 'front_matter_parser'
require 'git'
require 'jekyll'
require 'json'
require 'octopress-hooks'
require 'rake'
require_relative 'util.rb'
module Jekyll
class FetchRemote < Octopress::Hooks::Site
priority :highest
def self.copy(src, dest)
if (tmp = Array.try_convert(src))
tmp.each do |s|
s = File.path(s)
yield s, File.join(dest, File.basename(s))
end
else
src = File.path(src)
if File.directory?(dest)
yield src, File.join(dest, File.basename(src))
else
yield src, File.path(dest)
end
end
end
def self.resolve_line_numbers(first, last)
if first.nil? && last.nil?
first = 0
last = -1
elsif last.nil?
last = first
end
[first.to_i, last.to_i]
end
def self.git_init(repo, dir)
puts " Init repository"
git = Git.init(dir)
git.add_remote('origin', repo)
end
def self.git_fetch(repo, ref, dir)
unless Dir.exist?(dir)
FetchRemote.git_init(repo, dir)
end
begin
puts " Open repository"
git = Git.open(dir)
git.clean(force: true, d: true)
rescue => e
puts " WARNING: #{e}"
FileUtils.rm_rf(dir)
FetchRemote.git_init(repo, dir)
git = Git.open(dir)
end
puts " Fetch repository"
git.fetch('origin', tags: true)
puts " Checkout repository"
git.checkout(ref, force: true)
return git
end
def pre_read(site)
beginning_time = Time.now
puts "Starting plugin fetch_remote.rb..."
site.config['fetch-remote'].each do |entry|
puts " Repo #{entry['repo']} (#{entry['ref']})"
gituri = Git::URL.parse(entry['repo'])
clonedir = "#{Dir.tmpdir}/docker-docs-clone#{gituri.path}/#{Digest::SHA256.hexdigest(entry['ref'])}"
git = FetchRemote.git_fetch("#{entry['repo']}.git", entry['ref'], clonedir)
entry['paths'].each do |path|
if File.extname(path['dest']) != ""
if path['src'].size > 1
raise "Cannot use file destination #{path['dest']} with multiple sources"
end
FileUtils.mkdir_p File.dirname(path['dest'])
else
FileUtils.mkdir_p path['dest']
end
puts " Copying files"
# prepare file list to be copied
files = FileList[]
path['src'].each do |src|
if "#{src}".start_with?("!")
files.exclude(File.join(clonedir, "/"+"#{src}".delete_prefix("!")))
else
files.include(File.join(clonedir, "/#{src}"))
end
end
files.each do |file|
FetchRemote.copy(file, path['dest']) do |s, d|
s = File.realpath(s)
# traverse source directory
FileUtils::Entry_.new(s, nil, false).wrap_traverse(proc do |ent|
file_clean = ent.path.delete_prefix(clonedir).split("/").drop(1).join("/")
destent = FileUtils::Entry_.new(d, ent.rel, false)
puts " #{file_clean} => #{destent.path}"
if File.file?(destent.path)
fmp = FrontMatterParser::Parser.parse_file(destent.path)
if fmp['fetch_remote'].nil?
raise "Local file #{destent.path} already exists"
end
line_start, line_end = FetchRemote.resolve_line_numbers(fmp['fetch_remote'].kind_of?(Hash) ? fmp['fetch_remote']['line_start'] : nil, fmp['fetch_remote'].kind_of?(Hash) ? fmp['fetch_remote']['line_end'] : nil)
lines = File.readlines(ent.path)[line_start..line_end]
File.open(destent.path, "a") { |fow| fow.puts lines.join }
else
ent.copy destent.path
end
next unless File.file?(ent.path) && File.extname(ent.path) == ".md"
# set edit and issue url and remote info for markdown files in site config defaults
edit_url = "#{entry['repo']}/edit/#{entry['default_branch']}/#{file_clean}"
issue_url = "#{entry['repo']}/issues/new?body=File: [#{file_clean}](#{get_docs_url}/#{destent.path.sub(/#{File.extname(destent.path)}$/, '')}/)"
last_modified_at = git.log.path(file_clean).first.date.strftime(LastModifiedAt::DATE_FORMAT)
puts " edit_url: #{edit_url}"
puts " issue_url: #{issue_url}"
puts " last_modified_at: #{last_modified_at}"
site.config['defaults'] << {
"scope" => { "path" => destent.path },
"values" => {
"edit_url" => edit_url,
"issue_url" => issue_url,
"last_modified_at" => last_modified_at,
},
}
end, proc do |_| end)
end
end
end
end
end_time = Time.now
puts "done in #{(end_time - beginning_time)} seconds"
end
end
end

View File

@ -1,29 +0,0 @@
require 'jekyll'
require 'octopress-hooks'
require_relative 'util.rb'
module Jekyll
class FetchRemote < Octopress::Hooks::Site
def post_read(site)
beginning_time = Time.now
Jekyll.logger.info "Starting plugin fix_swagger.rb..."
# TODO: use dynamic URL from util.get_docs_url instead of hardcoded one
# but needs to remove first all absolute URLs in our code base.
docs_url = "https://docs.docker.com"
files = Dir.glob(%w[./docker-hub/api/*.yaml ./engine/api/*.yaml])
Jekyll.logger.info " Fixing up #{files.size} swagger file(s)..."
files.each do |f|
Jekyll.logger.info " #{f}"
text = File.read(f)
replace = text.gsub(docs_url, "")
File.open(f, "w") { |f2| f2.puts replace }
end
end_time = Time.now
Jekyll.logger.info "done in #{(end_time - beginning_time)} seconds"
end
end
end

View File

@ -1,28 +0,0 @@
require 'jekyll'
require 'octopress-hooks'
require_relative 'util.rb'
module Jekyll
class FetchRemote < Octopress::Hooks::Site
def post_write(site)
beginning_time = Time.now
Jekyll.logger.info "Starting plugin fix_url.rb..."
# TODO: use dynamic URL from util.get_docs_url instead of hardcoded one
# but needs to remove first all absolute URLs in our code base.
docs_url = "https://docs.docker.com"
files = Dir.glob("#{site.dest}/**/*.html")
Jekyll.logger.info " Fixing up URLs in #{files.size} html file(s) to be relative"
files.each do|f|
text = File.read(f)
replace = text.gsub(/(<a[^>]* href=\")#{docs_url}/, '\1')
File.open(f, "w") { |f2| f2.puts replace }
end
end_time = Time.now
Jekyll.logger.info "done in #{(end_time - beginning_time)} seconds"
end
end
end

View File

@ -1,65 +0,0 @@
require 'git'
require 'jekyll'
require 'octopress-hooks'
module Jekyll
class LastModifiedAt < Octopress::Hooks::Site
DATE_FORMAT = '%Y-%m-%d %H:%M:%S %z'
def current_last_modified_at(site, page)
if page.data.key?('last_modified_at')
return page.data['last_modified_at']
end
site.config['defaults'].map do |set|
if set['values'].key?('last_modified_at') && set['scope']['path'].include?(page.relative_path)
return set['values']['last_modified_at']
end
end.compact
nil
end
def pre_render(site)
beginning_time = Time.now
Jekyll.logger.info "Starting plugin last_modified_at.rb..."
git = Git.open(site.source)
use_file_mtime = get_docs_url == "http://localhost:4000" && ENV['DOCS_ENFORCE_GIT_LOG_HISTORY'] == "0"
site.pages.sort!{|l,r| l.relative_path <=> r.relative_path }.each do |page|
next if page.relative_path == "redirect.html"
next unless File.extname(page.relative_path) == ".md" || File.extname(page.relative_path) == ".html"
page.data['last_modified_at'] = current_last_modified_at(site, page)
set_mode = "frontmatter"
path_override = ""
if page.data['last_modified_at'].nil?
page_relative_path = page.relative_path
if page.data.key?('datafolder') && page.data.key?('datafile')
page_relative_path = File.join('_data', page.data['datafolder'], "#{page.data['datafile']}.yaml")
path_override = "\n override: #{page_relative_path}"
end
begin
if use_file_mtime
# Use file's mtime for local development
page.data['last_modified_at'] = File.mtime(page_relative_path).strftime(DATE_FORMAT)
set_mode = "mtime"
else
page.data['last_modified_at'] = git.log.path(page_relative_path).first.date.strftime(DATE_FORMAT)
set_mode = "git"
end
rescue => e
begin
page.data['last_modified_at'] = File.mtime(page_relative_path).strftime(DATE_FORMAT)
set_mode = "mtime"
rescue => e
page.data['last_modified_at'] = Time.now.strftime(DATE_FORMAT)
set_mode = "rescue"
end
end
end
puts" #{page.relative_path}#{path_override}\n last_modified_at(#{set_mode}): #{page.data['last_modified_at']}"
end
end_time = Time.now
Jekyll.logger.info "done in #{(end_time - beginning_time)} seconds"
end
end
end

View File

@ -1,38 +0,0 @@
require 'jekyll'
require 'octopress-hooks'
module Jekyll
class RedirectPage < Jekyll::Page
def initialize(site, src, redirect_to)
puts " #{src} => #{redirect_to}"
@site = site
@base = site.source
@dir = src
@name = "index.html"
process(@name)
@data = {
"sitemap" => false,
"redirect_to" => redirect_to
}
end
end
class PagelessRedirects < Octopress::Hooks::Site
def post_read(site)
beginning_time = Time.now
puts "Starting plugin pageless_redirects.rb..."
if File.file?("_redirects.yml")
rd = YAML.load_file("_redirects.yml")
rd.each do |redirect_to, srcs|
srcs.each do |src|
site.pages << RedirectPage.new(site, src, redirect_to)
end
end
end
end_time = Time.now
puts "done in #{(end_time - beginning_time)} seconds"
end
end
end

View File

@ -1,118 +0,0 @@
module Jekyll
# This custom Filter is used to fix up links to markdown pages that weren't
# resolved by Jekyll (or the "jekyll-relative-links" plugin). We need this hack
# to work around a bug in the "jekyll-relative-links" plugin;
#
# As reported in https://github.com/benbalter/jekyll-relative-links/issues/54,
# (relative) links to markdown pages in includes are not processed by Jekyll.
# This means that our reference pages (which use includes) have broken links.
# We could work around this by modifying the markdown for those pages to use
# "absolute" "html" links (/link/to/other/page/#some-anchor), but doing so
# would render the links broken when viewed on GitHub. Instead, we're fixing
# them up here, until the bug is fixed upstream.
#
# A second bug (https://github.com/benbalter/jekyll-relative-links/issues/61),
# causes (relative) links to markdown pages to not be resolved if the link's
# caption/title is wrapped. This bug is currently not handled by this plugin,
# but could possibly be addressed by modifying the TITLE_REGEX.
#
# This plugin is based on code in the jekyll-relative-links plugin, but takes
# some shortcuts;
#
# - We use the code from jekyll-relative-links plugin to find/extract links
# on the page
# - Relative links are converted to absolute links, using the path of the
# markdown source file that's passed as argument
# - After conversion to an absolute link, we strip the ".md" extension; no
# attempt is made to resolve the file that's linked to. This is different
# from the jekyll-relative-links plugin, which _does_ resolve the linked
# file. This functionality could be added in future by someone who has
# more experience with Ruby.
module RelativeLinksFilter
attr_accessor :site, :config
# Use Jekyll's native relative_url filter
include Jekyll::Filters::URLFilters
LINK_TEXT_REGEX = %r!(.*?)!.freeze
FRAGMENT_REGEX = %r!(#.+?)?!.freeze
TITLE_REGEX = %r{(\s+"(?:\\"|[^"])*(?<!\\)"|\s+"(?:\\'|[^'])*(?<!\\)')?}.freeze
FRAG_AND_TITLE_REGEX = %r!#{FRAGMENT_REGEX}#{TITLE_REGEX}!.freeze
INLINE_LINK_REGEX = %r!\[#{LINK_TEXT_REGEX}\]\(([^\)]+?)#{FRAG_AND_TITLE_REGEX}\)!.freeze
REFERENCE_LINK_REGEX = %r!^\s*?\[#{LINK_TEXT_REGEX}\]: (.+?)#{FRAG_AND_TITLE_REGEX}\s*?$!.freeze
LINK_REGEX = %r!(#{INLINE_LINK_REGEX}|#{REFERENCE_LINK_REGEX})!.freeze
def replace_relative_links(input, source_path)
url_base = File.dirname("/" + source_path)
input = input.dup.gsub(LINK_REGEX) do |original|
link = link_parts(Regexp.last_match)
next original unless replaceable_link?(link.path)
path = path_from_root(link.path, url_base)
url = path.gsub(".md", "/")
next original unless url
link.path = url
replacement_text(link)
end
end
private
# Stores info on a Markdown Link (avoid rubocop's Metrics/ParameterLists warning)
Link = Struct.new(:link_type, :text, :path, :fragment, :title)
def link_parts(matches)
last_inline = 5
link_type = matches[2] ? :inline : :reference
link_text = matches[link_type == :inline ? 2 : last_inline + 1]
relative_path = matches[link_type == :inline ? 3 : last_inline + 2]
fragment = matches[link_type == :inline ? 4 : last_inline + 3]
title = matches[link_type == :inline ? 5 : last_inline + 4]
Link.new(link_type, link_text, relative_path, fragment, title)
end
def path_from_root(relative_path, url_base)
relative_path.sub!(%r!\A/!, "")
absolute_path = File.expand_path(relative_path, url_base)
absolute_path.sub(%r!\A#{Regexp.escape(Dir.pwd)}/!, "")
end
# @param link [Link] A Link object describing the markdown link to make
def replacement_text(link)
link.path << link.fragment if link.fragment
if link.link_type == :inline
"[#{link.text}](#{link.path}#{link.title})"
else
"\n[#{link.text}]: #{link.path}#{link.title}"
end
end
def absolute_url?(string)
return unless string
Addressable::URI.parse(string).absolute?
rescue Addressable::URI::InvalidURIError
nil
end
def mdtarget?(string)
string&.include?(".md")
end
def fragment?(string)
string&.start_with?("#")
end
def replaceable_link?(string)
mdtarget?(string) && !fragment?(string) && !absolute_url?(string)
end
def global_entry_filter
@global_entry_filter ||= Jekyll::EntryFilter.new(site)
end
end
end
Liquid::Template.register_filter(Jekyll::RelativeLinksFilter)

View File

@ -1,24 +0,0 @@
require 'jekyll'
require 'octopress-hooks'
module Jekyll
class UpdateApiToc < Octopress::Hooks::Site
def pre_read(site)
beginning_time = Time.now
Jekyll.logger.info "Starting plugin update_api_toc.rb..."
if File.file?("_config.yml") && File.file?("_data/toc.yaml")
# substitute the "{site.latest_engine_api_version}" in the title for the latest
# API docs, based on the latest_engine_api_version parameter in _config.yml
engine_ver = site.config['latest_engine_api_version']
toc_file = File.read("_data/toc.yaml")
replace = toc_file.gsub!("{{ site.latest_engine_api_version }}", engine_ver)
Jekyll.logger.info " Replacing '{{ site.latest_engine_api_version }}' with #{engine_ver} in _data/toc.yaml"
File.open("_data/toc.yaml", "w") { |file| file.puts replace }
end
end_time = Time.now
Jekyll.logger.info "done in #{(end_time - beginning_time)} seconds"
end
end
end

View File

@ -1,18 +0,0 @@
require_relative 'util.rb'
Jekyll::Hooks.register :site, :post_write do |site|
beginning_time = Time.now
Jekyll.logger.info "Starting plugin update_sitemap.rb..."
sitemap_path = File.join(site.dest, 'sitemap.xml')
if File.exist?(sitemap_path)
sitemap_file = File.read(sitemap_path)
replace = sitemap_file.gsub!("<loc>/", "<loc>#{get_docs_url}/")
Jekyll.logger.info " Replacing '<loc>/' with '<loc>#{get_docs_url}/' in #{sitemap_path}"
File.open(sitemap_path, "w") { |file| file.puts replace }
end
end_time = Time.now
Jekyll.logger.info "done in #{(end_time - beginning_time)} seconds"
end

View File

@ -1,5 +0,0 @@
def get_docs_url
# DEPLOY_URL is from Netlify for preview
# https://docs.netlify.com/configure-builds/environment-variables/#deploy-urls-and-metadata
ENV['DEPLOY_URL'] || ENV['DOCS_URL'] || 'https://docs.docker.com'
end

View File

@ -1,99 +0,0 @@
// This file defines two palettes and is taken from Docker's Design System. The light palette should only be used
// in light mode, and vice versa. In general, if you use one of the colors
// in light mode, you should the same-named color in the dark palette in
// dark mode.
$white: #FFFFFF;
$light-page-background: #F9F9FA;
$dark-palette-background: #1C262D;
$grey-100: #EFEFF2;
$black: #000000;
// light palette contrast colors:
$light-grey-200: #E1E2E6;
$light-grey-300: #C4C8D1;
$light-grey-400: #8993A5;
$light-grey-500: #677285;
$light-grey-600: #505968;
$light-grey-700: #393F49;
$light-grey-800: #17191E;
$light-red-300: #EEA3A5;
$light-red-400: #E25D68;
$light-red-500: #D52536;
$light-red-600: #B72132;
$light-red-700: #8B1924;
$light-viole-200: #E9D4FF;
$light-viole-300: #C9A6FF;
$light-viole-400: #9860FF;
$light-viole-500: #7D2EFF;
$light-viole-600: #6D00EB;
$light-viole-700: #5700BB;
$light-viole-800: #220041;
$light-blue-100: #E5F2FC;
$light-blue-200: #C0E0FA;
$light-blue-300: #8BC7F5;
$light-blue-400: #1C90ED;
$light-blue-500: #086DD7;
$light-blue-600: #0055BD;
$light-blue-700: #1144A6;
$light-blue-800: #00084D;
$light-green-200: #C6EAE1;
$light-green-300: #88D5C0;
$light-green-400: #3BA08D;
$light-green-500: #2E7F74;
$light-green-600: #1E6C5F;
$light-green-700: #185A51;
$light-amber-100: #FFF4DC;
$light-amber-200: #FCE1A9;
$light-amber-300: #FBB552;
$light-amber-400: #DD7805;
$light-amber-500: #B85504;
// dark palette contrast colors:
$dark-grey-100: #141B1F;
$dark-grey-200: #27343E;
$dark-grey-300: #364754;
$dark-grey-400: #465C6E;
$dark-grey-500: #7794AB;
$dark-grey-600: #94ABBC;
$dark-grey-700: #ADBECB;
$dark-grey-800: #C4D0DA;
$dark-red-200: #951C2F;
$dark-red-300: #BC233C;
$dark-red-400: #D1334C;
$dark-red-500: #ED5669;
$dark-red-600: #E96C7C;
$dark-red-700: #EA8E9A;
$dark-red-800: #F0AAB4;
$dark-viole-100: #491D7B;
$dark-viole-200: #5F25A0;
$dark-viole-300: #7835D3;
$dark-viole-400: #8A53EC;
$dark-viole-500: #A371FC;
$dark-viole-600: #B38BFC;
$dark-viole-700: #C5A6FD;
$dark-viole-800: #D4BDFE;
$dark-blue-100: #06326D;
$dark-blue-200: #08489B;
$dark-blue-300: #1760CA;
$dark-blue-400: #2673E3;
$dark-blue-500: #3391EE;
$dark-blue-600: #55A4F1;
$dark-blue-700: #7CB9F4;
$dark-blue-800: #98C8F6;
$dark-green-200: #155048;
$dark-green-300: #176254;
$dark-green-400: #228375;
$dark-green-500: #2AA391;
$dark-green-600: #3CC1AD;
$dark-green-700: #7ACCC3;
$dark-green-800: #A5DDD6;
$dark-amber-300: #AF560A;
$dark-amber-400: #CD6A0A;
$dark-amber-500: #ED8D25;
$dark-amber-600: #F6A650;
$dark-amber-700: #F8B974;
$dark-amber-800: #FAC892;

View File

@ -1,32 +0,0 @@
html {
font-family: $font;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
color-scheme: light;
}
body {
background-color: $bg-body;
color: $body-text;
font-family: $font;
font-size: $body-text-size;
margin: 0;
padding: 0;
overflow-x: hidden;
}
a {
color: $primary-links;
text-decoration: none;
outline: none;
&:hover, &:focus {
opacity: .8;
text-decoration: none;
}
}
blockquote {
/* Override Bootstrap's style */
border-left: none;
}

View File

@ -1,39 +0,0 @@
$sm-min-width: 576px;
$md-min-width: 768px;
$lg-min-width: 992px;
$xl-min-width: 1200px;
@mixin sm-width {
@media (min-width: $sm-min-width) {
@content;
}
}
@mixin before-md-width {
@media (max-width: $md-min-width - 1) {
@content;
}
}
@mixin md-width {
@media (min-width: $md-min-width) {
@content;
}
}
@mixin before-lg-width {
@media (max-width: $lg-min-width - 1) {
@content;
}
}
@mixin lg-width {
@media (min-width: $lg-min-width) {
@content;
}
}
@mixin xl-width {
@media (min-width: $xl-min-width) {
@content;
}
}

View File

@ -1,71 +0,0 @@
ul.buttons {
list-style: none;
width: 450px;
margin: 0 auto;
}
a.button {
color: #fff;
}
a.button.outline-btn {
color: $primary-links;
float: none;
display: inline-block;
}
a.button.outline-btn.min-hgt {
min-height: 85px;
}
.button {
display: inline-block;
margin: 10px 10px 10px 0;
font-family: $buttons;
padding: 12px 35px;
min-width: 200px;
box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.1);
text-align: center;
white-space: nowrap;
&:hover {
color: #fff;
opacity: 0.7;
}
}
.primary-btn {
background: $primary-links;
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 4px;
}
/*
.secondary-btn {
background-color: rgba(255, 255, 255, 0.2);
box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.1);
border: 1px solid rgba(255, 255, 255, 0.1);
text-shadow: 0 1px rgba(0, 0, 0, 0.2);
}
.transparent-btn {
background-color: rgba(0, 0, 0, 0.2);
box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.1);
border: 1px solid rgba(0, 0, 0, 0.1);
text-shadow: 0 1px rgba(0, 0, 0, 0.2);
}
*/
.outline-btn {
background: #fff;
border: 1px solid $light-blue-400;
margin: 0;
&:hover {
color: $light-blue-400;
}
}
//.secondary-btn:hover,
.primary-btn:hover,
.outline-btn:hover {
opacity: 0.8;
}

View File

@ -1,25 +0,0 @@
/* This palette is deprecated */
$red-90: #9e1011;
$marine-10: #9fd1f9;
$marine-50: #007bff;
$marine-90: #002c66;
$grey-10: #d7dade;
$blue-60: #2496ed;
$blue-70: #1282d7;
$blue-80: #076cad;
$orange-10: #fef5c3;
$orange-20: #f9e3ae;
$orange-90: #d4611d;
$white-0: #ffffff;
$white-5: #fafafb;
$white-10: #f7f7f8;
$white-15: #f2f3f5;
$white-25: #e9ebee;
$black-0: #0f161e;

View File

@ -1,116 +0,0 @@
//This has now been deprecated. See DS-colors instead//
// This file defines two palettes. The light palette should only be used
// in light mode, and vice versa. In general, if you use one of the colors
// in light mode, you should the same-named color in the dark palette in
// dark mode.
// light palette contrast colors:
// 100-400: black
// 500-800: white
$light-palette-background: #F9F9FA;
$light-palette-amber-100: #FFF6E2;
$light-palette-amber-200: #FCE1A9;
$light-palette-amber-300: #FBB552;
$light-palette-amber-400: #DD7805;
$light-palette-amber-500: #B85504;
$light-palette-amber-600: #AA4409;
$light-palette-amber-700: #893607;
$light-palette-amber-800: #421A02;
$light-palette-blue-100: #E8F4FD;
$light-palette-blue-200: #C0E0FA;
$light-palette-blue-300: #8BC7F5;
$light-palette-blue-400: #1C90ED;
$light-palette-blue-500: #116ED0;
$light-palette-blue-600: #0055BD;
$light-palette-blue-700: #1144A6;
$light-palette-blue-800: #00084D;
$light-palette-green-100: #F3FAF9;
$light-palette-green-200: #C6EAE1;
$light-palette-green-300: #88D5C0;
$light-palette-green-400: #3BA08D;
$light-palette-green-500: #2E7F74;
$light-palette-green-600: #1E6C5F;
$light-palette-green-700: #185A51;
$light-palette-green-800: #0C2C28;
$light-palette-grey-100: #EAEAED;
$light-palette-grey-200: #E1E2E6;
$light-palette-grey-300: #C4C8D1;
$light-palette-grey-400: #8993A5;
$light-palette-grey-500: #677285;
$light-palette-grey-600: #505968;
$light-palette-grey-700: #393F49;
$light-palette-grey-800: #17191E;
$light-palette-red-100: #FEEFEF;
$light-palette-red-200: #F6CFD0;
$light-palette-red-300: #EEA3A5;
$light-palette-red-400: #E25D68;
$light-palette-red-500: #D52536;
$light-palette-red-600: #B72132;
$light-palette-red-700: #8B1924;
$light-palette-red-800: #350A10;
$light-palette-violet-100: #F7ECFF;
$light-palette-violet-200: #E9D4FF;
$light-palette-violet-300: #C9A6FF;
$light-palette-violet-400: #9860FF;
$light-palette-violet-500: #7D2EFF;
$light-palette-violet-600: #6D00EB;
$light-palette-violet-700: #5700BB;
$light-palette-violet-800: #220041;
// dark palette contrast colors:
// 100-400: white
// 500-800: black
$dark-palette-background: #1C262D;
$dark-palette-amber-100: #672805;
$dark-palette-amber-200: #7B3606;
$dark-palette-amber-300: #944307;
$dark-palette-amber-400: #AF560A;
$dark-palette-amber-500: #CD6A0A;
$dark-palette-amber-600: #ED8D25;
$dark-palette-amber-700: #F6A650;
$dark-palette-amber-800: #F8B974;
$dark-palette-blue-100: #0B1B46;
$dark-palette-blue-200: #06326D;
$dark-palette-blue-300: #084391;
$dark-palette-blue-400: #1557B8;
$dark-palette-blue-500: #116ED0;
$dark-palette-blue-600: #3391EE;
$dark-palette-blue-700: #55A4F1;
$dark-palette-blue-800: #7CB9F4;
$dark-palette-green-100: #0D342E;
$dark-palette-green-200: #11423B;
$dark-palette-green-300: #145348;
$dark-palette-green-400: #1A655A;
$dark-palette-green-500: #228375;
$dark-palette-green-600: #2AA391;
$dark-palette-green-700: #3CC1AD;
$dark-palette-green-800: #7ACCC3;
$dark-palette-grey-100: #141B1F;
$dark-palette-grey-200: #27343E;
$dark-palette-grey-300: #364754;
$dark-palette-grey-400: #465C6E;
$dark-palette-grey-500: #7794AB;
$dark-palette-grey-600: #94ABBC;
$dark-palette-grey-700: #ADBECB;
$dark-palette-grey-800: #C4D0DA;
$dark-palette-red-100: #58111B;
$dark-palette-red-200: #741624;
$dark-palette-red-300: #951C2F;
$dark-palette-red-400: #BC233C;
$dark-palette-red-500: #C32438;
$dark-palette-red-600: #DD4659;
$dark-palette-red-700: #E36676;
$dark-palette-red-800: #EA8E9A;
$dark-palette-violet-100: #341458;
$dark-palette-violet-200: #491D7B;
$dark-palette-violet-300: #5F25A0;
$dark-palette-violet-400: #8032D6;
$dark-palette-violet-500: #8A53EC;
$dark-palette-violet-600: #A371FC;
$dark-palette-violet-700: #B38BFC;
$dark-palette-violet-800: #C5A6FD;

View File

@ -1,205 +0,0 @@
.content, p {
line-height: 24px;
clear: both;
img {
display: block;
height: auto;
max-width: 100%;
}
}
/*
* Code formatting *************************************************************
*/
pre, code {
background-color: $light-page-background!important;
color: $light-blue-600 !important;
}
pre {
border: 0;
border-radius: 4px;
display: block;
padding: 20.5px!important;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.42857143;
word-break: normal !important;
word-wrap: break-word;
code {
overflow-x: auto;
overflow-wrap: normal;
white-space: pre;
}
}
code {
border-radius: 2px;
font-size: 90%;
padding: 3px 7px;
overflow-x: scroll;
}
.highlighter-rouge {
margin: 15px 0;
position: relative;
button.copy {
position: absolute;
top: 10px;
right: 10px;
background: none;
border: none;
}
}
/*
* Guides : components *********************************************************
*/
.component-container {
padding: 0;
margin: 0 0 50px;
width: 100%;
.row {
display: flex;
flex-wrap: wrap;
}
// "get-docker" tiles
.row > .block {
display: flex;
flex-direction: column;
padding: 10px;
}
.component {
padding: 15px 25px 15px 15px;
text-align: center;
height: 100%;
width: 100%;
background: $bg-component;
img {
height: 70px;
}
.component-icon {
display: flex;
justify-content: center;
}
h2 {
font-size: 18px;
}
h2, h3, p {
margin: 0;
}
}
}
a.anchorLink {
font-size: 0.5em;
margin-left: 5px;
visibility: hidden;
}
h1:hover > a.anchorLink,
h2:hover > a.anchorLink,
h3:hover > a.anchorLink
{
visibility: visible;
}
a.glossary {
color: $body-text;
outline: none;
&:hover {
opacity: 1;
}
}
a.accept-eula {
font-weight: bold;
}
/* Style the Image Used to Trigger the Modal */
main img {
border-radius: 5px;
cursor: pointer;
transition: 0.3s;
}
main img:hover {opacity: 0.7;}
/* The Modal (background) */
.modal1 {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.9); /* Black w/ opacity */
}
/* Modal Content (Image) */
.modal-content1 {
margin: auto;
display: block;
width: 90%;
top:20px;
}
/* Caption of Modal Image (Image Text) - Same Width as the Image */
#img-modal-caption1 {
margin: 15px auto;
display: block;
width: 80%;
max-width: 700px;
text-align: center;
color: #ccc;
padding: 10px 0;
height: 150px;
}
/* Add Animation - Zoom in the Modal */
.modal-content1, #img-modal-caption1 {
animation-name: zoom;
animation-duration: 0.6s;
}
@keyframes zoom {
from {transform:scale(0)}
to {transform:scale(1)}
}
/* The Close Button */
#img-modal-close1 {
font-size: 40px;
font-weight: bold;
color: #f1f1f1;
transition: 0.3s;
margin-right: 10px;
}
#img-modal-close1:hover,
#img-modal-close1:focus {
color: #bbb;
text-decoration: none;
cursor: pointer;
}
/* 100% Image Width on Smaller Screens */
@media only screen and (max-width: 700px){
.modal-content {
width: 100%;
}
}

View File

@ -1,104 +0,0 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
// color: #333;
}
.hljs-comment,
.hljs-quote {
// color: #998;
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
// color: #333;
font-weight: bold;
}
/*
.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
color: #008080;
}
*/
.hljs-string,
.hljs-doctag {
color: #d14;
}
.hljs-title,
.hljs-section,
.hljs-selector-id {
// color: #900;
font-weight: bold;
}
.hljs-subst {
font-weight: normal;
}
.hljs-type,
.hljs-class .hljs-title {
// color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-name,
.hljs-attribute {
// color: #000080;
font-weight: normal;
}
/*
.hljs-regexp,
.hljs-link {
color: #009926;
}
.hljs-symbol,
.hljs-bullet {
color: #990073;
}
.hljs-built_in,
.hljs-builtin-name {
color: #0086b3;
}
*/
.hljs-meta {
// color: #999;
font-weight: bold;
}
/*
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
*/
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -1,341 +0,0 @@
$dark-blue: #002c66;
body.landing {
background-color: $bg-body-landing;
h2, h5, h6 {
font-family: $headings-landing;
}
section {
margin-top: 40px;
margin-bottom: 40px;
}
.header {
// Container holds both the top-navigation bar (div.navbar-header), and
// the "hamburger menu" (div.navbar-collapse)
>.container {
background-color: $bg-header;
}
@include md-width {
.navbar-collapse.collapse {
display: flex !important;
ul:first-of-type {
flex: 1;
display: flex;
justify-content: center;
}
}
}
@include before-lg-width {
.container {
width: unset;
}
}
a, .toggle-mode {
color: white;
}
.navbar-brand {
padding-top: 12px;
padding-bottom: 12px;
}
.navbar-toggle {
margin: 15px;
height: 20px;
display: block;
@include md-width {
display: none;
}
}
.toggle-mode {
margin-top: 15px;
.icon {
margin-top: 4px;
}
}
}
.hero {
padding-top: 20px;
h2 {
font-size: 32px;
line-height: 32px;
margin-bottom: 14px;
}
input {
font-size: 18px;
height: 50px;
line-height: 24px;
padding: 13px 20px;
&:focus {
box-shadow: none;
outline: none;
}
}
#autocompleteResults {
left: 14px;
right: 14px;
width: unset;
@include before-lg-width {
padding: 0;
}
}
}
.card-holder {
padding: 7.5px;
}
.video-item {
display: flex;
flex-direction: row;
align-items: center;
margin-top: 6.5px;
margin-bottom: 6.5px;
.video-image {
margin-right: 13px;
}
.video-title {
flex: 1;
}
}
%icon-card {
background-image: none;
background-origin: content-box;
background-repeat: no-repeat;
background-size: auto 35px;
@include sm-width { background-size: auto 40px; min-height: 220px; }
@include md-width { background-size: auto 50px }
@include lg-width { background-size: auto 60px }
.title {
margin-top: 0;
margin-left: 60px;
@include sm-width { margin-left: 0; margin-top: 60px }
@include md-width { margin-left: 0; margin-top: 72px }
@include lg-width { margin-left: 0; margin-top: 90px }
}
p {
margin-left: 60px;
@include sm-width { margin-left: 0 }
}
}
$icons: rocket, download-docker, guides, language-guides, whats-new, manuals, reference;
.card {
color: $body-text;
background-color: $bg-card;
box-shadow: 0 3px 6px rgba(11, 33, 74, 0.09),
0 -2px 2px rgba(11, 33, 74, 0.03);
padding: 24px 36px;
min-height: 100px;
@include sm-width {
min-height: 185px;
}
@each $icon in $icons {
&.#{$icon} {
@extend %icon-card;
background-image: url("/assets/images/#{$icon}.svg");
}
}
.title {
font-size: 16px;
line-height: 16px;
margin: 10px 0;
@include sm-width {
font-size: 18px;
line-height: 18px;
margin: 6px 0;
}
@include md-width {
font-size: 20px;
line-height: 20px;
margin: 6px 0;
}
@include lg-width {
font-size: 22px;
line-height: 22px;
margin: 8px 0;
}
}
p {
font-size: 14px;
line-height: 19px;
}
}
a.card {
display: block;
transition: transform 150ms ease-in-out;
&:hover {
opacity: 1;
transform: scale(1.01);
}
&[target=_blank] {
background-image: url(/assets/images/arrow.svg);
background-position: top 10px right 10px;
background-repeat: no-repeat;
background-size: 15px 15px;
}
}
.cardlet {
background-color: $grey-100;
padding: 24px 36px;
.title {
font-family: "Roboto", sans-serif;
line-height: 22px;
font-size: 22px;
}
p {
font-size: 14px;
line-height: 18px;
}
}
section.cta-banner {
background-color: $dark-blue;
padding: 65px 0;
h2, h5, p {
color: white;
}
text-align: center;
@include md-width {
text-align: left;
}
img {
margin-bottom: 10px;
max-height: 190px;
}
h2 {
font-size: 32px;
line-height: 37px;;
}
a.btn {
background: $white;
color: $dark-blue-400;
font-size: 17px;
margin-top: 20px;
padding: 15px 30px;
img {
margin: 0;
}
&.slack-button {
background: white;
color: $dark-blue;
padding: 2px 25px 2px 10px;
}
}
}
.tab-section {
.title {
font-family: "Roboto", sans-serif;
font-size: 22px;
}
ul.nav.nav-tabs li a, h5, h6 {
font-family: 'Roboto', sans-serif;
font-size: 18px;
}
ul.nav.nav-tabs {
margin-bottom: 30px;
li a {
cursor: pointer;
padding: 10px 3px;
@include sm-width { padding: 10px 15px; }
}
li.active a {
background-color: inherit;
border: none;
border-bottom: 5px solid $dark-blue-500;
}
}
.row[data-tab] {
display: none;
&[data-os] .only-win,
&[data-os] .only-mac {
display: none;
}
&[data-os="win"] .only-win,
&[data-os="mac"] .only-mac {
display: initial;
}
&[data-os="win"] p.only-win,
&[data-os="mac"] p.only-mac {
display: block;
}
&.active {
display: block;
}
.image {
background-position: center;
background-size: contain;
background-repeat: no-repeat;
margin-top: 15px;
width: 130px;
height: 130px;
margin-left: auto;
margin-right: auto;
}
}
}
footer {
background-color: $bg-footer-landing;
margin-top: 130px;
a, p {
color: white;
}
}
}

View File

@ -1,224 +0,0 @@
/*
* branding ********************************************************************
*/
.logo {
margin: 12px 10px 0 10px;
width: 160px;
display: none;
@include lg-width {
display: initial;
}
}
.logo-mobile {
a {
float: left;
img {
margin: 12px 15px;
height: 30px;
}
}
@include lg-width {
display: none;
}
}
/*
* Header **********************************************************************
*/
.header {
background-color: $bg-header;
position: relative;
z-index: 1;
transition: all 0.1s ease;
border: unset;
border-radius: unset;
height: unset;
}
.columns {
flex-direction: column;
}
.col-nav {
order: -1;
}
.col-body {
display: flex;
flex-direction: row;
flex: 1;
min-height: 555px;
}
.col-content {
flex: 1;
padding: $top-navigation-height 20px 40px 40px;
max-width: 1024px;
min-width: 300px;
min-height: 500px;
}
.col-nav,
.col-toc {
flex: 0 0 0;
}
.col-toc-hidden {
display: none;
}
@media only screen and (min-width: 1000px) {
.col-nav,
.col-toc {
flex: 0 0 21em;
}
}
section.section {
margin: 0 auto;
}
/*
* sidebar *********************************************************************
*/
.wrapper.right-open #sidebar-wrapper {
width: 270px;
}
.wrapper.right-open .page-content {
padding-right: 190px;
}
.col-nav,
.col-toc {
min-height: 100vh;
}
.col-nav {
// background-color: $bg-sidebar;
border-right: 1px solid #ddd;
}
.col-toc {
margin-left: auto;
}
.sidebar {
position: sticky;
top: $top-navigation-height;
overflow: auto;
max-height: calc(100vh - #{$top-navigation-height});
padding-bottom: 20px;
}
/*
* global footer **************************************************************
*/
footer {
background: $white;
border-top: 1px solid $light-grey-200;
position: relative;
}
.top_footer {
padding: 50px 0 35px;
}
.footer_links {
list-style: none;
padding: 0;
li {
margin-bottom: 10px;
a {
color: $black;
font-size: 12px;
line-height: 16px;
}
}
}
.footer_sub_nav {
float: right;
padding: 10px 30px 20px 0;
ul {
list-style: none;
margin: 0;
padding: 0;
li {
float: left;
margin-left: 10px;
padding-bottom: 6px;
a {
color: $white;
font-size: 12px;
}
}
}
}
.bottom_footer {
clear: both;
padding: 30px 0 20px;
border-top: 1px solid $light-grey-200;
float: left;
width: 100%;
}
.footer-copyright {
float: left;
}
.footer-copyright p {
font-size: 12px;
line-height: 17px;
color: $light-grey-500;
margin-bottom: 0;
padding: 0 0 15px;
}
.footer_social_nav {
float: right;
padding: 0 15px 0 0;
}
.footer_social_nav ul {
list-style: none;
padding: 0;
margin: 0;
}
.footer_social_nav ul li {
float: left;
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.footer_social_nav ul li:before {
color: $white;
position: absolute;
}
.footer_social_nav ul li+li {
margin-left: 10px;
}
.footer_social_nav ul li a {
width: 32px;
height: 32px;
background-color: $light-grey-400;
border-radius: 50px;
color: $white;
display: block;
text-indent: 9999px;
overflow: hidden;
}

View File

@ -1,278 +0,0 @@
/*
* for rescaling **************************************************************
*/
@media only screen
and (min-width : 376px)
and (max-width : 1150px) {
.nav-primary,
ul.primary.nav.navbar-nav {
display: none;
}
.header {
height: 55px;
}
.tabs li a {
font-size: 13px;
}
h1,
h2,
h3 {
margin-top: 10px;
margin-bottom: 0;
}
h1 {
font-size: 24px;
line-height: 28px;
}
h2 {
font-size: 20px;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
.nav-secondary .search-form input[type=search] {
min-width: auto;
}
.nav-container,
.nav-secondary {
overflow: hidden;
}
.nav-sidebar ul li li a {
border-left: 0;
font-size: 12px;
margin-left: 0;
}
}
@media only screen
and (min-width : 376px)
and (max-width : 900px) {
.sidebar {
position: fixed;
top: 55px; // top-navigation bar (without breadcrumbs)
width: 100%;
z-index: 100;
background-color: $bg-sidebar;
}
}
/*
* small displays mobile **********************************************************
*/
/* Portrait and Landscape */
@media only screen
and (min-device-width: 320px)
and (max-device-width: 670px) {
.logo,
.ctrl-right {
display: none;///// CHECK THIS /////
}
.nav-container {
overflow: visible;
height: auto;
}
iframe {
width: 100%;
}
}
/* Portrait */
@media only screen
and (min-device-width: 320px)
and (max-device-width: 667px)
and (orientation: portrait) {
h1,
h2,
h3 {
margin-top: 10px;
margin-bottom: 0;
}
h1 {
font-size: 24px;
line-height: 28px;
}
h2 {
font-size: 20px;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
.header {
height: 100px;
}
.tabs {
float: left;
margin: 0;
padding: 5px 0 0 17px;
}
.tabs li a {
color: #fff;
padding: 17px 6px 10px 4px;
float: left;
opacity: 0.7;
font-size: 12px;
}
.content {
padding: 65px 25px;
}
.sidebar {
background-color: $bg-sidebar;
top: 51px;
left: 0;
display: block;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: fixed;
width: 100%;
}
.search-form {
display: block!important;
}
.top_footer {
padding: 50px 0 35px;
text-align: center;
}
}
@media only screen
and (min-device-width: 320px)
and (max-device-width: 372px)
and (orientation: portrait) {
.tabs {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
justify-content: space-between;
width: 100%;
padding: 5px 0 0 0;
}
.tabs li a {
margin-left: 0;
font-weight: normal;
}
}
/* Landscape */
@media only screen
and (min-device-width: 320px)
and (max-device-width: 667px)
and (orientation: landscape) {
h1,
h2,
h3 {
margin-top: 10px;
margin-bottom: 0;
}
h1 {
font-size: 24px;
line-height: 28px;
}
h2 {
font-size: 20px;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
.header {
height: 100px;
}
.content {
padding: 120px 20px;
}
.sidebar {
background-color: $bg-sidebar;
top: 55px; // top-navigation bar (without breadcrumbs)
left: 0;
display: block;
padding: 0;
overflow-x: hidden;
overflow-y: auto;
position: fixed;
width: 100%;
}
}
/*
* medium displays mobile *****************************************************
*/
@media only screen
and (min-device-width: 768px)
and (max-device-width: 1110px) {
.logo {
margin: 12px 10px 0 10px;
width: 130px;
}
h1,
h2,
h3 {
margin-top: 10px;
margin-bottom: 0;
}
h1 {
font-size: 24px;
line-height: 28px;
}
h2 {
font-size: 20px;
}
h3 {
font-size: 18px;
}
h4 {
font-size: 16px;
}
.toc-nav a {
font-size: 11px;
}
.sidebar {
background-color: $bg-sidebar;
}
}
/* Landscape */
@media only screen
and (min-device-width: 768px)
and (max-device-width: 1024px)
and (orientation: landscape) {
.ctrl-right {
display: block;
}
.sidebar, .sidebar.affix {
width: 270px;
}
}
.navbar-toggle {
display: block;
}
@media (min-width: 992px) {
.navbar-toggle {
display: none;
}
.nav-sidebar.collapse {
display: block;
}
}

View File

@ -1,337 +0,0 @@
/*
* Primary navigation - top header *********************************************
*/
.nav-container {
height: 55px;
}
.sidebar-toggle {
margin: 4px 0 0 0;
float: right;
padding: 16px 15px 0 0;
}
/*
* Secondary Navigation *******************************************************
*/
.nav-secondary {
background-color: $bg-secondary;
box-shadow: 0 1px 13px rgba(0, 0, 0, 0.24);
}
/*
* Breadcrumbs ****************************************************************
*/
.breadcrumb {
background-color: $bg-sidebar-active;
border-radius: 0;
margin-bottom: 0;
padding-left: 22px; // left-align with logo
border-bottom: 0.1px solid rgba($primary-links, .5);
a:not([href]) {
cursor: default;
}
}
/*
* NAV SIDEBAR *****************************************************************
*/
// Some links don't have 'href' attr, hence no mouse pointer
.nav-sidebar li a {
cursor: pointer;
color: $light-grey-800;
}
.nav-sidebar>li>a {
padding-right: 20px;
padding-left: 20px;
}
.nav-sidebar>.active>a,
.nav-sidebar>.active>a:focus,
.nav-sidebar>.active>a:hover {
color: $light-blue-600;
background-color: $light-blue-500;
}
.nav-sidebar ul {
list-style: none;
padding: 0;
text-align: left;
li {
display: block;
}
}
.nav-sidebar .nav ul {
padding: 0 0 0 15px;
}
.nav-sidebar ul li a:hover {
opacity: 0.7;
background: transparent;
}
.nav-sidebar ul li a,
.nav-sidebar ul li a:focus {
border-bottom: none;
// border-left: 1px solid $light-grey-200;
}
.nav-sidebar .nav > li > a {
padding-left: 22px; // left-padding to align with logo
&.active {
padding-left: 19px; // compensate for 1px -> 4px border-width
}
@include before-md-width {
padding-right: 32px; // right-align with hamburger menu
}
}
.nav-sidebar ul li a.active,
.nav-sidebar.nav > li > a:focus {
background: $bg-sidebar-active;
border-left: 4px solid $light-blue-500;
font-weight: 600;
color: $light-blue-500;
}
.nav-sidebar ul li ul li a {
font-size: 12px;
margin-left: 8px;
}
.nav-sidebar .caret {
float: right;
margin-top: 10px;
}
/* pointer for collapsed sidebar list items */
.collapsed
{
cursor:pointer;
}
/*
* Table of contents menu *****************************************************
*/
.toc-toggle {
width: 25px;
height: 25px;
float: right;
}
.toc-nav ul {
list-style: none;
margin: 0;
padding-left: 10px;
line-height: 20px;
li {
padding: 2px 8px 2px 0;
width: 100%;
a {
display: inline-block;
font-size: 12px;
padding: 2px 10px 2px 10px;
color: $light-grey-500;
}
.slider{
background-color: $light-grey-200;
border: 1px solid $light-grey-200;
}
.slider:before{
background-color: $light-grey-500;
}
}
}
.toc-nav li a.active {
border-left: 4px solid $light-grey-500;
font-weight: bold;
color: $light-grey-500;
}
.toc-nav i.fa {
font-size: 14px;
margin: 0 8px 0 0;
color: $light-grey-500;
}
div.side-toc-title {
font-size: 12px;
font-weight: bold;
margin: 11px 0 10px 13px;
color: $light-grey-500;
}
.edit {
margin: 10px 0 20px 15px;
}
/*
* Toggle Switches *************************************************************
*/
.toggle-mode {
float: left;
padding: 0 0 0 10px;
width: 100%;
.icon {
width: 25px;
float: left;
font-size: 1rem;
}
}
.toggle-switch {
float: left;
height: 40px;
width: 60px;
padding: 3px 7px 0 2px;
}
.switch {
position: relative;
display: inline-block;
width: 47px;
height: 19px;
}
.switch input {
display: none;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: $slider-bg;
border: 1px solid $light-blue-200;
}
.slider:before {
background-color: $slider-btn;
position: absolute;
content: "";
height: 15px;
width: 15px;
left: 2px;
bottom: 1px;
}
input:focus+.slider {
box-shadow: 0 0 1px $slider-btn;
}
input:checked+.slider:before {
-webkit-transform: translateX(26px);
transform: translateX(26px);
}
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
/*
* Tabs ************************************************************************
*/
.navbar-nav > li > a {
border-left: 4px solid rgba($white, 0.0);
}
.navbar-nav > li.active > a {
border-left: 4px solid rgba($white, 0.75);
}
@include md-width {
.landing .navbar-nav > li > a {
padding-top: 17px;
padding-bottom: 9px;
}
.navbar-nav > li > a {
color: $white;
line-height: 25px;
padding-top: 14px;
padding-bottom: 12px;
font-weight: 600;
&:hover {
background-color: rgba(0, 0, 0, 0.17);
border-bottom: 4px solid $white;
}
}
.navbar-nav > li.active > a {
cursor: default;
border-left: none;
border-bottom: 4px solid $white;
}
}
div.feedback-links {
margin: 15px 0 10px 0;
}
div.metadata-items {
margin: 15px 0 10px 0;
ul {
list-style: none;
margin: 0;
padding-left: 20px;
line-height: 20px;
li {
padding: 2px 8px 2px 0;
width: 100%;
font-size: 12px;
a {
padding: 0;
}
}
}
}
div.keywords-items {
padding-left: 20px;
font-size: 12px;
a {
display: inline-block;
margin-right: 8px;
i.fa {
margin: 0;
}
}
}
/*
* Controls ********************************************************************
*/
.ctrl-left {
float: left;
width: 20px;
margin: 3px 0 0 0;
}
.ctrl-right {
float: right;
padding: 5px 0;
}
.ctrl-right .btn-group {
float: left;
margin: 2px 0 0;
}

View File

@ -1,282 +0,0 @@
html.night {
color-scheme: dark;
$icons: rocket, download-docker, guides, language-guides, whats-new, manuals, reference;
body {
background-color: $bg-body-night;
color: $body-text-night;
&.landing {
background-color: $bg-body-landing-night;
.header > .container {
background-color: $bg-header-night;
}
.card, .cardlet {
color: inherit;
background-color: $bg-card-night;
&.rocket {
background-image: url(/assets/images/rocket-dark.svg)
}
&.download-docker {
background-image: url(/assets/images/download-docker-dark.svg)
}
&.guides {
background-image: url(/assets/images/guides-dark.svg)
}
&.language-guides {
background-image: url(/assets/images/language-guides-dark.svg)
}
&.manuals {
background-image: url(/assets/images/manuals-dark.svg)
}
&.reference {
background-image: url(/assets/images/reference-dark.svg)
}
}
footer {
background-color: $bg-footer-landing-night;
}
}
}
a {
color: $dark-blue-600;
}
.rating-nero-value,
.reading-time,
.release-date {
color: $body-text-night !important;
}
h1,h2,h3,h4,h5,h6,
div#side-toc-title {
color: $white;
}
.button {
color: $white;
}
a:not(.btn):not(.button) {
//color: $primary-links-night;
}
.header {
background-color: $bg-header-night;
color: $white;
}
hr {
border-top: 1px solid #4f6071;
}
.nav-secondary {
background-color: $bg-header-night;
}
.breadcrumb {
background-color: $dark-grey-100;
border-bottom: 0.1px solid $dark-grey-700;
}
.sidebar,
.col-nav {
background-color: $bg-sidebar-night;
border: none;
color: $dark-grey-700;
}
.nav-sidebar li a {
cursor: pointer;
color: $dark-grey-700;
}
.toc-nav ul li a {
color: $dark-grey-700;
}
.nav-sidebar ul li a.active,
.nav-sidebar.nav > li > a:focus,
.toc-nav li a.active {
background: $dark-palette-background;
//border-left: 4px solid $dark-blue-800;
color: $white;
}
div.side-toc-title {
color: $dark-grey-700;
}
.navbar-nav > li.active > a {
border-color: $dark-blue-600;
border-bottom: 4px solid $white;
}
.slider {
background-color: #344658;
border: 1px solid #192837;
}
table {
border: 1px solid #1b1a1a;
color: #cbdbe6;
}
table>tbody>tr:nth-of-type(even) {
background-color: #1f3341;
}
thead {
background: #2b4252;
}
pre {
color: #f3f3f3;
background-color: #0a121b !important;
border: 1px solid $black;
}
code {
color: $dark-grey-700 !important;
background: #0a121b !important;
}
.nav-secondary .dropdown-btn {
color: #d0e8ff;
}
.outline-btn {
background: $bg-sidebar-night;
border: 1px solid $body-text;
}
a.button.outline-btn {
color: $primary-links-night;
}
a.glossary,
.toc-nav i.fa {
color: $body-text-night;
}
#autocompleteResults {
background: $bg-search-results-night;
border: 1px solid $black;
//color: $white;
}
.autocompleteResult {
&.selected {
background-color: #1f262e;
}
li {
color: #b4c3d2;
}
span {
color: #b7a4de;
}
}
/* for google results styles - forgive us css gods */
.gsc-control-cse .gsc-webResult.gsc-result, .gsc-results .gsc-imageResult {
border-color: #192837!important;
background-color: #192837!important;
}
.gsc-webResult.gsc-result:hover, .gsc-imageResult:hover {
border-color: #25374a!important;
background-color: #192837!important;
}
a.gs-title {
color: $dark-grey-700 !important;
text-decoration: none;
}
.gs-webResult .gs-snippet, .gs-imageResult .gs-snippet, .gs-fileFormatType {
color: #a8b0b7!important;
}
.gs-webResult.gs-result a.gs-title:link, .gs-webResult.gs-result a.gs-title:link b, .gs-imageResult a.gs-title:link, .gs-imageResult a.gs-title:link b {
color: $dark-blue-700!important;
}
.component {
background: $bg-component-night;
img {
opacity: 1;
filter: grayscale(100%) brightness(2);
}
}
.transparent-btn {
background-color: rgb(0, 135, 200);
box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.1);
border: 1px solid rgba(0, 0, 0, 0.1);
text-shadow: 0 1px rgba(0, 0, 0, 0.2);
}
.primary-btn{
background: $dark-blue-100;
}
.footer {
background-color: $bg-footer-night;
border-top: 1px solid rgb(31, 52, 66);
}
.footer_links li a {
color: $white;
}
.bottom_footer {
border-top: 1px solid rgb(78, 93, 106);
}
.footer_social_nav ul li a {
background-color: #2f2f2f;
}
.footer_sub_nav ul li a {
color: $white;
}
.footer-copyright p {
color: $white;
}
/* syntax highlighting */
.highlight {
.nt {
color: #FBB552;
}
.k {
color: #EEA3A5;
}
}
/* apply to images with garbled text */
img.white-bg {
background-color: white;
}
/* apply to images that support being inverted */
img.invertible {
filter: invert(100%) hue-rotate(180deg);
}
/* accordion */
.panel {
color: $body-text-night;
background-color: #24394c;
}
.panel-default {
border-color: #374656;
>.panel-heading {
color: #c0c3c4;
background-color: $bg-sidebar-night;
border-color: #2f4050;
}
}
.panel-body {
background: rgb(35, 54, 72);
color: #bcbfc3;
}
/* modals */
.modal-content {
background-color: $bg-sidebar-night;
border-left: 4px solid $primary-links;
}
/* tabs */
.nav-tabs {
border-bottom: 1px solid #4f6071;
color: $dark-grey-700;
}
.nav-tabs>li>a {
color: $dark-grey-700;
}
.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover {
color: $white;
background-color: $dark-grey-200;
border: 1px solid transparent;
}
.popover {
color: $black;
}
.pagination>li>a, .pagination>li>span {
background-color: #0f1c2a!important;
border: 1px solid #0f1c2a!important;
}
.pagination>.active>a {
background: #000!important;
color: $white!important;
}
}

View File

@ -1,206 +0,0 @@
//noinspection CssNoGenericFontName
/*
These rules control the display of notes/notifications/alerts. They can be used like so:
> This is a paid feature
>
> Docker Hub Vulnerability Scanning is available for developers subscribed to a Pro or a Team plan. For more information about the pricing plans, see [Docker Pricing](https://www.docker.com/pricing?utm_source=docker&utm_medium=webreferral&utm_campaign=docs_driven_upgrade)
{: .restricted }
(The first line is always treated as a header, unless it's the only line)
The available classes are:
.important: Yellow
.warning: Red/orange
.tip: Green
.restricted: Purple, used to indicate features that require paid plans
[no class]: Blue, the default
*/
@mixin notification($bg-color, $header-color, $body-text-color, $icon) {
background-color: $bg-color;
font-size: unset; // override bootstrap font-size for blockquotes
// The first child will generally be a header (e.g. "Note" or "This is an experimental feature"),
// but we have some notes that don't have headers; if there's only one child of the note,
// assume it's not a header
> p:first-child:not(:only-child) {
color: $header-color;
font-weight: 700;
margin-top: 0;
// https://fontawesome.com/docs/web/setup/upgrade/pseudo-elements
&::before {
text-rendering: auto;
-webkit-font-smoothing: antialiased;
font: var(--fa-font-solid);
content: "#{$icon} \00a0";
}
}
> p:only-child, > p:not(:first-child) {
color: $body-text-color;
}
a {
text-decoration: underline;
}
}
blockquote {
html.night & {
// DARK THEME
&:not(.important):not(.warning):not(.restricted):not(.experimental):not(.tip) {
@include notification(
$bg-color: $dark-blue-200,
$header-color: $white,
$body-text-color: $white,
$icon: "\f06a"
);
a {
color: $dark-blue-800;
};
}
&.important {
@include notification(
$bg-color: $dark-amber-300,
$header-color: $white,
$body-text-color: $white,
$icon: "\f06a"
);
a {
color: $dark-blue-200;
}
}
&.warning {
@include notification(
$bg-color: $dark-red-200,
$header-color: $white,
$body-text-color: $white,
$icon: "\f06a"
);
}
&.restricted {
@include notification(
$bg-color: $dark-viole-200,
$header-color: $white,
$body-text-color: $white,
$icon: "\f135"
);
}
&.experimental {
@include notification(
$bg-color: $dark-blue-200,
$header-color: $white,
$body-text-color: $white,
$icon: "\f492"
);
}
&.tip {
@include notification(
$bg-color: $dark-green-200,
$header-color: $white,
$body-text-color: $white,
$icon: "\f164"
);
}
}
html:not(.night) & {
// LIGHT THEME
&:not(.important):not(.warning):not(.restricted):not(.experimental):not(.tip) {
@include notification(
$bg-color: $light-blue-100,
$header-color: $light-blue-600,
$body-text-color: inherit,
$icon: "\f05a"
);
}
&.important {
@include notification(
$bg-color: $light-amber-100,
$header-color: $dark-amber-300,
$body-text-color: inherit,
$icon: "\f06a"
);
}
&.warning {
@include notification(
$bg-color: $light-red-300,
$header-color: $light-red-700,
$body-text-color: inherit,
$icon: "\f06a"
);
}
&.restricted {
@include notification(
$bg-color: $light-viole-200,
$header-color: $light-viole-600,
$body-text-color: inherit,
$icon: "\f135"
);
}
&.experimental {
@include notification(
$bg-color: $light-blue-100,
$header-color: $light-blue-500,
$body-text-color: inherit,
$icon: "\f492"
);
}
&.tip {
@include notification(
$bg-color: $light-green-200,
$header-color: $light-green-600,
$body-text-color: inherit,
$icon: "\f164"
)
}
}
}
/* For Bootstrap badges */
span {
&.badge {
border-radius: .25rem;
color: #fff;
display: inline-block;
font-size: 75%;
font-weight: bold;
line-height: 1;
padding: .25em .4em;
text-align: center;
vertical-align: baseline;
white-space: nowrap;
&.badge-info {
background-color: $note-color;
}
&.badge-danger {
background-color: $warning-color;
}
&.badge-warning {
background-color: $important-color;
}
}
}

View File

@ -1,158 +0,0 @@
/*
* Bootstrap Overrides *********************************************************
*/
.navbar-toggle {
padding: 0;
margin: 0;
.icon-bar {
background-color: #fff !important;
}
}
.navbar-collapse,
.navbar-form {
border-color: transparent;
}
.nav>li>a:focus,
.nav>li>a:hover {
background-color: transparent;
}
.dropdown-menu>li>a {
font-size: 13.5px;
line-height: 16px;
color: $light-blue-400;
padding: 5px 15px;
display: block;
}
.btn {
font-weight: bold;
}
.btn-primary, .btn-secondary {
padding: 10px 15px 6px;
font-family: $buttons;
}
.btn-primary {
background-color: $light-blue-500;
border: 1px solid rgba(0, 0, 0, 0.1);
&:hover {
opacity: 0.8;
// override default bootstrap behaviour
background-color: $light-blue-500;
border: 1px solid rgba(0, 0, 0, 0.1);
}
}
.btn-default:hover {
color: #fff!important;
background-color: transparent!important;
border-color: none!important;
box-shadow: none!important;
opacity: .8;
}
.btn-group.open .dropdown-toggle {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
background: transparent;
color: #fff;
box-shadow: none;
}
.btn-default:focus,
.btn-default.active,
.btn-default:active,
.open>.dropdown-toggle.btn-default:focus,
.open>.dropdown-toggle.btn-default:hover {
color: #fff!important;
background-color: transparent!important;
border-color: transparent !important;
box-shadow: none!important
}
.nav .open>a,
.nav .open>a:focus,
.nav .open>a:hover {
background-color: transparent;
border-color: $primary-links;
}
.dropdown-menu>li>a:focus,
.dropdown-menu>li>a:hover {
color: #ffffff;
background-color: $light-blue-700;
}
/*
* Bootstrap expand/collapse accordions ****************************************
*/
.panel-heading .chevron::after {
content: "\f0d8";
}
.panel-heading.collapsed .chevron::after {
content: "\f0d7";
}
.panel-heading:hover{
background-color: #fafdfe;
}
/*
* override google results +++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
.gs-webResult .gs-snippet, .gs-imageResult .gs-snippet, .gs-fileFormatType {
color: $light-blue-700!important;
line-height: 23px!important;
}
.gsc-webResult .gsc-result {
padding: 20px 0 20px 20px!important;
}
a.gs-title {
color: $light-blue-500!important;
text-decoration: none;
}
.gs-webResult.gs-result a.gs-title:visited, .gs-webResult.gs-result a.gs-title:visited b, .gs-imageResult a.gs-title:visited, .gs-imageResult a.gs-title:visited b {
color: $light-red-400!important;
}
.gs-webResult div.gs-visibleUrl, .gs-imageResult div.gs-visibleUrl {
color: $light-grey-600!important;
}
.gs-webResult .gs-snippet, .gs-imageResult .gs-snippet, .gs-fileFormatType {
font-size: 14px!important;
}
.gsc-tabHeader.gsc-tabhActive, .gsc-tabsArea {
border-color: #f7f7f761 !important;
background: transparent;
}
.gsc-tabHeader.gsc-tabActive, .gsc-refinementHeader.gscrefinementActive{
color: $dark-grey-700!important;
}
.gsc-results .gsc-cursor-box .gsc-cursor-page{
color: $black!important;
}
input.gsc-search-button, input.gsc-search-button:hover, input.gsc-search-button:focus {
display: none!important;
}
.cse .gsc-search-button input.gsc-search-button-v2,
input.gsc-search-button-v2 {
width: 13px;
height: 13px;
padding: 6px 27px;
min-width: 13px;
margin-top: 2px;
}

View File

@ -1,88 +0,0 @@
/*
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeeedd } */
.highlight .c { color: #3BA08D } /* Comment */
.highlight .err { color: #B72132 } /* Error */
.highlight .k { color: #8B008B } /* Keyword */
.highlight .ch { color: #3BA08D } /* Comment.Hashbang */
.highlight .cm { color: #3BA08D } /* Comment.Multiline */
.highlight .cp { color: #1e889b } /* Comment.Preproc */
.highlight .cpf { color: #3BA08D } /* Comment.PreprocFile */
.highlight .c1 { color: #3BA08D } /* Comment.Single */
.highlight .cs { color: #8B008B } /* Comment.Special */
.highlight .gd { color: #B72132 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #B72132 } /* Generic.Error */
.highlight .gh { color: #9860FF } /* Generic.Heading */
.highlight .gi { color: #00aa00 } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
// Prevent selecting comments, command-output and command-prompt in shell
// examples that use the "console" lexer/highlighter to allow easier copying.
// See https://github.com/rouge-ruby/rouge/issues/1023
.language-console .highlight .c,
.language-console .highlight .go,
.language-console .highlight .gp
{
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none
}
// Show a "text" cursor for the prompt. Even though the prompt itself is not
// selectable, make it appear as if it is, so that users don't get confused
// when they try to select an example for copying.
.language-console .highlight .gp {
cursor: text;
}
.highlight .gs {} /* Generic.Strong */
.highlight .gu { color: #800080 } /* Generic.Subheading */
.highlight .gt { color: #B72132 } /* Generic.Traceback */
.highlight .kc { color: #8B008B } /* Keyword.Constant */
.highlight .kd { color: #8B008B } /* Keyword.Declaration */
.highlight .kn { color: #8B008B } /* Keyword.Namespace */
.highlight .kp { color: #8B008B } /* Keyword.Pseudo */
.highlight .kr { color: #8B008B } /* Keyword.Reserved */
.highlight .kt { color: #1C90ED } /* Keyword.Type */
.highlight .m { color: #B452CD } /* Literal.Number */
.highlight .s { color: #E25D68 } /* Literal.String */
.highlight .na { color: #658b00 } /* Name.Attribute */
.highlight .nb { color: #658b00 } /* Name.Builtin */
.highlight .nc { color: #88D5C0 } /* Name.Class */
.highlight .no { color: #1C90ED } /* Name.Constant */
.highlight .nd { color: #707a7c } /* Name.Decorator */
.highlight .ne { color: #88D5C0 } /* Name.Exception */
/*.highlight .nf { color: #88D5C0 } Name.Function */
.highlight .nn { color: #88D5C0 } /* Name.Namespace */
.highlight .nt { color: #8B008B } /* Name.Tag */
.highlight .nv { color: #1C90ED } /* Name.Variable */
.highlight .ow { color: #8B008B } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #B452CD } /* Literal.Number.Bin */
.highlight .mf { color: #B452CD } /* Literal.Number.Float */
.highlight .mh { color: #B452CD } /* Literal.Number.Hex */
.highlight .mi { color: #B452CD } /* Literal.Number.Integer */
.highlight .mo { color: #B452CD } /* Literal.Number.Oct */
.highlight .sa { color: #E25D68 } /* Literal.String.Affix */
.highlight .sb { color: #E25D68 } /* Literal.String.Backtick */
.highlight .sc { color: #E25D68 } /* Literal.String.Char */
.highlight .dl { color: #E25D68 } /* Literal.String.Delimiter */
.highlight .sd { color: #E25D68 } /* Literal.String.Doc */
.highlight .s2 { color: #E25D68 } /* Literal.String.Double */
.highlight .se { color: #E25D68 } /* Literal.String.Escape */
.highlight .sh { color: #1c7e71 } /* Literal.String.Heredoc */
.highlight .si { color: #E25D68 } /* Literal.String.Interpol */
.highlight .sx { color: #cb6c20 } /* Literal.String.Other */
.highlight .sr { color: #1c7e71 } /* Literal.String.Regex */
.highlight .s1 { color: #E25D68 } /* Literal.String.Single */
.highlight .ss { color: #E25D68 } /* Literal.String.Symbol */
.highlight .bp { color: #658b00 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #88D5C0 } /* Name.Function.Magic */
.highlight .vc { color: #1C90ED } /* Name.Variable.Class */
.highlight .vg { color: #1C90ED } /* Name.Variable.Global */
.highlight .vi { color: #1C90ED } /* Name.Variable.Instance */
.highlight .vm { color: #1C90ED } /* Name.Variable.Magic */
.highlight .il { color: #B452CD } /* Literal.Number.Integer.Long */

View File

@ -1,195 +0,0 @@
/*
* Fonts **********************************************************************
*/
@font-face {
font-family: 'Geomanist Book';
src: url("../assets/fonts/geomanist/hinted-Geomanist-Book.eot");
src: url("../assets/fonts/geomanist/hinted-Geomanist-Book.eot?#iefix") format("embedded-opentype"), url("../assets/fonts/geomanist/hinted-Geomanist-Book.woff2") format("woff2"), url("../assets/fonts/geomanist/hinted-Geomanist-Book.woff") format("woff"), url("../assets/fonts/geomanist/hinted-Geomanist-Book.ttf") format("truetype"), url("../assets/fonts/geomanist/hinted-Geomanist-Book.svg#Geomanist-Book") format("svg");
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Geomanist Regular';
src: url("../assets/fonts/geomanist/hinted-Geomanist-Regular.eot");
src: url("../assets/fonts/geomanist/hinted-Geomanist-Regular.eot?#iefix") format("embedded-opentype"), url("../assets/fonts/geomanist/hinted-Geomanist-Regular.woff2") format("woff2"), url("../assets/fonts/geomanist/hinted-Geomanist-Regular.woff") format("woff"), url("../assets/fonts/geomanist/hinted-Geomanist-Regular.ttf") format("truetype"), url("../assets/fonts/geomanist/hinted-Geomanist-Book.svg#Geomanist-Regular") format("svg");
font-weight: normal;
font-style: normal;
font-display: swap;
}
/*
* inlining the style from https://fonts.googleapis.com/css?family=Open+Sans&display=swap
*
* We're only including the "latin" glyphs. While including @font-faces for more
* glyphs would not cause the fonts to be loaded, it would make the stylesheet
* itself larger, and we don't need those glyhps for our purpose as the website
* is written in US-English; https://stackoverflow.com/a/14897846/1811501
*/
/* latin */
/*@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
font-display: fallback;
src: local('Open Sans Regular'), local('OpenSans-Regular'), url(https://fonts.gstatic.com/s/opensans/v18/mem8YaGs126MiZpBA-UFVZ0bf8pkAg.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
h1,h2,h3,h4,h5,h6 {
font-family: $headings;
clear: both;
line-height: 26px;
margin-top: 30px;
margin-bottom: 0;
font-weight: 600;
}
h1 {
font-size: 36px;
line-height: 48px;
}
h2 {
font-size: 28px;
line-height: 38px;
}
h3 {
font-size: 22px;
}
h4 {
font-size: 18px;
}
h5 {
font-size: 16px;
}
h6 {
color: #82949e;
font-size: 14px;
}
dd, dt {
line-height: 25px;
}
ol, ul {
padding-left: 25px;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 500;
font-display: swap;
src: url(https://fonts.gstatic.com/s/roboto/v30/KFOlCnqEu92Fr1MmEU9fBBc4.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin */
@font-face {
font-family: 'Roboto';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/roboto/v30/KFOmCnqEu92Fr1Mu4mxK.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
/* latin */
@font-face {
font-family: 'Roboto Mono';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url(https://fonts.gstatic.com/s/robotomono/v22/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0mQ.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
html, body {
font-family: 'Roboto', sans-serif;
font-size: 14px;
}
h1, .h1 {
font-size: 2.5rem;
font-weight: 500;
line-height: 1.167;
}
h2, .h2 {
font-size: 2rem;
font-weight: 500;
line-height: 1.2;
}
h3, .h3 {
font-size: 1.5rem;
font-weight: 500;
line-height: 1.167;
}
h4, .h4 {
font-size: 1.286rem;
font-weight: 500;
line-height: 1.235;
}
.subtitle1 {
font-size: 1.143rem;
font-weight: 500;
line-height: 1.75;
}
p, .body1 {
font-size: 1rem;
line-height: 1.5;
}
p {
margin: 0 0 16px;
}
.body2 {
font-size: 0.86rem;
line-height: 1.43;
}
code, pre {
font-size: 1rem;
font-family: 'Roboto Mono', monospace;
}
.overline {
font-size: 0.72rem;
font-weight: 500;
line-height: 2.66;
text-transform: uppercase;
}
.inline-code {
font-size: 1rem;
font-family: 'Roboto Mono', monospace;
background-color: white; /* black if dark mode */
border: 1px solid #E1E2E6; /* grey.200 */
padding: 0.2em 0.4em;
border-radius: 4px;
}
.code-block {
font-size: 1rem;
font-family: 'Roboto Mono', monospace;
background-color: white; /* black if dark mode */
border: 1px solid #E1E2E6; /* grey.200 */
padding: 8px;
border-radius: 4px;
display: block;
}

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