mirror of https://github.com/docker/docs.git
migrate to hugo
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
This commit is contained in:
parent
4bbeb2093f
commit
a0d21ade2f
|
@ -1,3 +0,0 @@
|
||||||
FROM docker/dev-environments-ruby:stable-1
|
|
||||||
RUN gem install bundler jekyll
|
|
||||||
CMD ["bundle", "install"]
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
"dockerfile": "Dockerfile.devenv"
|
|
||||||
}
|
|
|
@ -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
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
root = true
|
|
||||||
|
|
||||||
[*.{scss,html,md}]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
DirectoryPath: "_site"
|
DirectoryPath: "public"
|
||||||
EnforceHTTPS: false
|
EnforceHTTPS: false
|
||||||
CheckDoctype: false
|
CheckDoctype: false
|
||||||
CheckExternal: false
|
CheckExternal: false
|
||||||
|
|
|
@ -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'
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"plugins": ["prettier-plugin-tailwindcss"]
|
||||||
|
}
|
|
@ -1 +0,0 @@
|
||||||
2.7.6
|
|
29
404.md
29
404.md
|
@ -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}
|
|
||||||
|
|
||||||
[](/ "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>
|
|
150
Dockerfile
150
Dockerfile
|
@ -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
22
Gemfile
|
@ -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'
|
|
107
Gemfile.lock
107
Gemfile.lock
|
@ -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
|
|
37
Makefile
37
Makefile
|
@ -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
|
|
293
_config.yml
293
_config.yml
|
@ -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"
|
|
|
@ -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
|
|
|
@ -1,5 +0,0 @@
|
||||||
##
|
|
||||||
# This file overrides options set in _config.yml for staging environment (https://docs-stage.docker.com/)
|
|
||||||
##
|
|
||||||
|
|
||||||
hotjar_id: 3218181
|
|
|
@ -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"
|
|
|
@ -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
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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. aren’t 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.
|
|
|
@ -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 organization’s 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.
|
|
|
@ -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**
|
|
||||||
|
|
||||||
{: width="500px" }
|
|
||||||
|
|
||||||
{: 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 you’ve 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 you’ve 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 }}
|
|
|
@ -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 aren’t 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 user’s name, and then select {{ remove_button }}.
|
|
||||||
4. Follow the on-screen instructions to remove the user.
|
|
||||||
|
|
||||||
## What's next?
|
|
||||||
|
|
||||||
- {{ scim_link }}
|
|
||||||
- {{ mapping_link }}
|
|
|
@ -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 application’s 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 }}.
|
|
|
@ -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 -%}
|
|
|
@ -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 %}
|
|
|
@ -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 %}
|
|
|
@ -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 -%}
|
|
156
_includes/cli.md
156
_includes/cli.md
|
@ -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>
|
|
||||||
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 %}
|
|
|
@ -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.
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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).
|
|
|
@ -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 -%}
|
|
|
@ -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 -->
|
|
||||||
|
|
||||||
Here’s 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.
|
|
|
@ -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">×</span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<p>
|
|
||||||
We’ve 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>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<!-- This text will be included in topics containing Docker Desktop download URLs -->
|
|
||||||
<span class="no-js">We’ve 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>
|
|
|
@ -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 © 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>
|
|
|
@ -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 }}
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -1,5 +0,0 @@
|
||||||
<div id="img-modal1" class="modal1">
|
|
||||||
<span class="close1" id="img-modal-close1">×</span>
|
|
||||||
<img src="/" alt="/" class="modal-content1" id="img-modal-img1">
|
|
||||||
<div id="img-modal-caption1"></div>
|
|
||||||
</div>
|
|
|
@ -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 Docker’s 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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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, there’s 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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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 Desktop’s 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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -1 +0,0 @@
|
||||||
<em class="release-date">{{ include.date }}</em>
|
|
|
@ -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>
|
|
|
@ -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 }}
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -1,15 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en-US">
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Redirecting…</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…</h1>
|
|
||||||
<a href="{{ page.redirect.to }}">Click here if you are not redirected.</a>
|
|
||||||
<script>location="{{ page.redirect.to }}"</script>
|
|
||||||
</html>
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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)
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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;
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
|
@ -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;
|
|
|
@ -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%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
|
@ -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 */
|
|
|
@ -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
Loading…
Reference in New Issue