diff --git a/.gitignore b/.gitignore index 8bffd3f..55de554 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,218 @@ !.vscode/*.code-snippets .history/ *.vsix +node_modules/.package-lock.json +node_modules/.bin/prettier +node_modules/@reteps/dockerfmt/package.json +node_modules/@reteps/dockerfmt/README.md +node_modules/@reteps/dockerfmt/dist/format.d.ts +node_modules/@reteps/dockerfmt/dist/format.js +node_modules/@reteps/dockerfmt/dist/format.wasm +node_modules/@reteps/dockerfmt/dist/node.d.ts +node_modules/@reteps/dockerfmt/dist/node.js +node_modules/@reteps/dockerfmt/dist/wasm_exec.js +node_modules/prettier/doc.d.ts +node_modules/prettier/doc.js +node_modules/prettier/doc.mjs +node_modules/prettier/index.cjs +node_modules/prettier/index.d.ts +node_modules/prettier/index.mjs +node_modules/prettier/LICENSE +node_modules/prettier/package.json +node_modules/prettier/README.md +node_modules/prettier/standalone.d.ts +node_modules/prettier/standalone.js +node_modules/prettier/standalone.mjs +node_modules/prettier/THIRD-PARTY-NOTICES.md +node_modules/prettier/bin/prettier.cjs +node_modules/prettier/internal/experimental-cli-worker.mjs +node_modules/prettier/internal/experimental-cli.mjs +node_modules/prettier/internal/legacy-cli.mjs +node_modules/prettier/plugins/acorn.d.ts +node_modules/prettier/plugins/acorn.js +node_modules/prettier/plugins/acorn.mjs +node_modules/prettier/plugins/angular.d.ts +node_modules/prettier/plugins/angular.js +node_modules/prettier/plugins/angular.mjs +node_modules/prettier/plugins/babel.d.ts +node_modules/prettier/plugins/babel.js +node_modules/prettier/plugins/babel.mjs +node_modules/prettier/plugins/estree.d.ts +node_modules/prettier/plugins/estree.js +node_modules/prettier/plugins/estree.mjs +node_modules/prettier/plugins/flow.d.ts +node_modules/prettier/plugins/flow.js +node_modules/prettier/plugins/flow.mjs +node_modules/prettier/plugins/glimmer.d.ts +node_modules/prettier/plugins/glimmer.js +node_modules/prettier/plugins/glimmer.mjs +node_modules/prettier/plugins/graphql.d.ts +node_modules/prettier/plugins/graphql.js +node_modules/prettier/plugins/graphql.mjs +node_modules/prettier/plugins/html.d.ts +node_modules/prettier/plugins/html.js +node_modules/prettier/plugins/html.mjs +node_modules/prettier/plugins/markdown.d.ts +node_modules/prettier/plugins/markdown.js +node_modules/prettier/plugins/markdown.mjs +node_modules/prettier/plugins/meriyah.d.ts +node_modules/prettier/plugins/meriyah.js +node_modules/prettier/plugins/meriyah.mjs +node_modules/prettier/plugins/postcss.d.ts +node_modules/prettier/plugins/postcss.js +node_modules/prettier/plugins/postcss.mjs +node_modules/prettier/plugins/typescript.d.ts +node_modules/prettier/plugins/typescript.js +node_modules/prettier/plugins/typescript.mjs +node_modules/prettier/plugins/yaml.d.ts +node_modules/prettier/plugins/yaml.js +node_modules/prettier/plugins/yaml.mjs +node_modules/prettier-plugin-jinja-template/.prettierignore +node_modules/prettier-plugin-jinja-template/.prettierrc +node_modules/prettier-plugin-jinja-template/babel.config.js +node_modules/prettier-plugin-jinja-template/jest.config.js +node_modules/prettier-plugin-jinja-template/LICENSE +node_modules/prettier-plugin-jinja-template/package.json +node_modules/prettier-plugin-jinja-template/README.md +node_modules/prettier-plugin-jinja-template/tsconfig.json +node_modules/prettier-plugin-jinja-template/.github/workflows/node.js.yml +node_modules/prettier-plugin-jinja-template/lib/index.d.ts +node_modules/prettier-plugin-jinja-template/lib/index.js +node_modules/prettier-plugin-jinja-template/lib/jinja.d.ts +node_modules/prettier-plugin-jinja-template/lib/jinja.js +node_modules/prettier-plugin-jinja-template/lib/parser.d.ts +node_modules/prettier-plugin-jinja-template/lib/parser.js +node_modules/prettier-plugin-jinja-template/lib/printer.d.ts +node_modules/prettier-plugin-jinja-template/lib/printer.js +node_modules/prettier-plugin-jinja-template/lib/regex.d.ts +node_modules/prettier-plugin-jinja-template/lib/regex.js +node_modules/prettier-plugin-jinja-template/src/index.ts +node_modules/prettier-plugin-jinja-template/src/jinja.ts +node_modules/prettier-plugin-jinja-template/src/parser.ts +node_modules/prettier-plugin-jinja-template/src/printer.ts +node_modules/prettier-plugin-jinja-template/src/regex_editable.ts +node_modules/prettier-plugin-jinja-template/src/regex.ts +node_modules/prettier-plugin-jinja-template/test/parser.test.ts +node_modules/prettier-plugin-jinja-template/test/plugin.test.ts +node_modules/prettier-plugin-jinja-template/test/printer.test.ts +node_modules/prettier-plugin-jinja-template/test/cases/collition/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/collition/input.html +node_modules/prettier-plugin-jinja-template/test/cases/comment/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/comment/input.html +node_modules/prettier-plugin-jinja-template/test/cases/empty/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/empty/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_2/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_2/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_as_attr/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_as_attr/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_empty/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_empty/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_escaped/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_escaped/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_long/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_long/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_multi/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_multi/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_multiline/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_multiline/input.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_whitespace/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/expression_whitespace/input.html +node_modules/prettier-plugin-jinja-template/test/cases/ignore/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/ignore/input.html +node_modules/prettier-plugin-jinja-template/test/cases/ignore_jinja/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/ignore_jinja/input.html +node_modules/prettier-plugin-jinja-template/test/cases/issue_25/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/issue_25/input.html +node_modules/prettier-plugin-jinja-template/test/cases/newline_between/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/newline_between/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_after_script/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_after_script/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_broken/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_broken/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_broken_2/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_broken_2/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_broken_3/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_broken_3/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_empty_block/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_empty_block/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_for_else/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_for_else/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_if_else/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_if_else/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_if_else_2/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_if_else_2/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_inline/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_inline/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_long/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_long/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_multiple/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_multiple/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_multiple_else/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_multiple_else/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_non_closing/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_non_closing/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_set/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_set/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_underscore_end/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_underscore_end/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_unknown/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_unknown/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_whitespace/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_whitespace/input.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_with/expected.html +node_modules/prettier-plugin-jinja-template/test/cases/statement_with/input.html +node_modules/prettier-plugin-sh/index.d.cts +node_modules/prettier-plugin-sh/LICENSE +node_modules/prettier-plugin-sh/package.json +node_modules/prettier-plugin-sh/README.md +node_modules/prettier-plugin-sh/lib/index.cjs +node_modules/prettier-plugin-sh/lib/index.d.ts +node_modules/prettier-plugin-sh/lib/index.js +node_modules/prettier-plugin-sh/lib/index.js.map +node_modules/prettier-plugin-sh/lib/languages.d.ts +node_modules/prettier-plugin-sh/lib/languages.js +node_modules/prettier-plugin-sh/lib/languages.js.map +node_modules/sh-syntax/LICENSE +node_modules/sh-syntax/main.wasm +node_modules/sh-syntax/package.json +node_modules/sh-syntax/README.md +node_modules/sh-syntax/lib/browser.d.ts +node_modules/sh-syntax/lib/browser.js +node_modules/sh-syntax/lib/browser.js.map +node_modules/sh-syntax/lib/index.cjs +node_modules/sh-syntax/lib/index.d.cts +node_modules/sh-syntax/lib/index.d.ts +node_modules/sh-syntax/lib/index.js +node_modules/sh-syntax/lib/index.js.map +node_modules/sh-syntax/lib/processor.d.ts +node_modules/sh-syntax/lib/processor.js +node_modules/sh-syntax/lib/processor.js.map +node_modules/sh-syntax/lib/shim.d.ts +node_modules/sh-syntax/lib/shim.js +node_modules/sh-syntax/lib/shim.js.map +node_modules/sh-syntax/lib/types.d.ts +node_modules/sh-syntax/lib/types.js +node_modules/sh-syntax/lib/types.js.map +node_modules/sh-syntax/vendors/wasm_exec.cjs +node_modules/sh-syntax/vendors/wasm_exec.d.cts +node_modules/tslib/CopyrightNotice.txt +node_modules/tslib/LICENSE.txt +node_modules/tslib/package.json +node_modules/tslib/README.md +node_modules/tslib/SECURITY.md +node_modules/tslib/tslib.d.ts +node_modules/tslib/tslib.es6.html +node_modules/tslib/tslib.es6.js +node_modules/tslib/tslib.es6.mjs +node_modules/tslib/tslib.html +node_modules/tslib/tslib.js +node_modules/tslib/modules/index.d.ts +node_modules/tslib/modules/index.js +node_modules/tslib/modules/package.json # Node.js node_modules diff --git a/README.md b/README.md index 1f96b56..4b8a0b2 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,146 @@ # SteamCMD Docker Image -
+[](https://developer.valvesoftware.com/wiki/SteamCMD) -## About +[](https://hub.docker.com/r/gameservermanagers/steamcmd) +[](https://github.com/GameServerManagers/docker-steamcmd/actions) +[](https://www.codacy.com/gh/GameServerManagers/docker-steamcmd/dashboard) +[](https://developer.valvesoftware.com/wiki/SteamCMD) +[](https://github.com/GameServerManagers/docker-steamcmd/blob/main/LICENSE) -SteamCMD is a command-line version of the Steam client. It allows you to download and install games on a headless server. This container image builds daily and is available on [Docker Hub](https://hub.docker.com/r/gameservermanagers/steamcmd) as well as [GitHub Container Registry](https://github.com/GameServerManagers/docker-steamcmd/pkgs/container/steamcmd). +> Lightweight, daily-built SteamCMD base image for game server automation. -## Tags +## Quick Start -- `latest`, `ubuntu` - Latest Ubuntu LTS release -- `ubuntu-24.04` - Ubuntu 24.04 LTS 'Noble Numbat' -- `ubuntu-22.04` - Ubuntu 22.04 LTS 'Jammy Jackalope' -- `ubuntu-20.04` - Ubuntu 20.04 LTS 'Focal Fossa' -- `ubuntu-18.04` - Ubuntu 18.04 LTS 'Bionic Beaver' +Pull the latest image and open SteamCMD interactive prompt: -## Usage +```bash +docker pull gameservermanagers/steamcmd:latest +docker run -it --rm gameservermanagers/steamcmd:latest +``` -Docker cli +Download (update) a dedicated server into the current host directory (example: CS2 / app 730): ```bash -docker run -it gameservermanagers/steamcmd:latest +docker run -it --rm \ + -v "$PWD:/data" \ + gameservermanagers/steamcmd:latest \ + +force_install_dir /data +login anonymous +app_update 730 validate +quit ``` -Download Counter Strike: Global Offensive Dedicated Server to current host directory. +Persist Steam content in a named volume: + +```bash +docker volume create steamcmd-data +docker run -it --rm -v steamcmd-data:/home/steam/Steam gameservermanagers/steamcmd:latest +login anonymous +quit +``` + +## Tags & Platforms + +| Tag(s) | Ubuntu Release | Notes | +| ------ | -------------- | ----- | +| `latest`, `ubuntu` | 24.04 LTS (Noble) | Alias to most recent LTS | +| `ubuntu-24.04` | 24.04 LTS | Current LTS | +| `ubuntu-22.04` | 22.04 LTS | Previous LTS | +| `ubuntu-20.04` | 20.04 LTS | Legacy (receives security updates) | +| `ubuntu-18.04` | 18.04 LTS | Legacy / nearing EOL upstream | + +Currently built for: `linux/amd64`. + +## Features + +- Daily scheduled build + build on Dockerfile changes +- Non-root `steam` user (security best practice) +- Minimal packages; apt caches cleaned +- HEALTHCHECK (lightweight SteamCMD invocation) +- Multi-version tag set for pinning + +## Usage Examples + +Anonymous login and quit (cache initialization): + +```bash +docker run --rm gameservermanagers/steamcmd:latest +login anonymous +quit +``` + +Install/Update Valheim dedicated server (app 896660) into a local folder: + +```bash +mkdir -p valheim && \ +docker run --rm -v "$PWD/valheim:/data" gameservermanagers/steamcmd:latest \ + +force_install_dir /data +login anonymous +app_update 896660 validate +quit +``` + +Run with a different timezone: + +```bash +docker run --rm -e TZ=UTC gameservermanagers/steamcmd:latest +login anonymous +quit +``` + +## Data Persistence + +Steam content is stored under `/home/steam/Steam` (owned by the non-root `steam` user). Mount a volume there to persist downloads across runs. ```bash -docker run -it -v $PWD:/data gameservermanagers/steamcmd:latest +force_install_dir /data +login anonymous +app_update 740 +quit +docker run -v steamcmd-data:/home/steam/Steam gameservermanagers/steamcmd:latest +login anonymous +quit ``` -## Notes +## Configuration + +Common tunables (all optional): + +| Option | How | Purpose | +| ------ | --- | ------- | +| Timezone | `-e TZ=Europe/London` | Control tzdata (if installed) | +| Working dir | `-w /home/steam` | Override working directory | +| User mapping | `--user $(id -u):$(id -g)` | Run with host UID/GID (if perms needed) | + +Steam credentials (if you need a non-anonymous app): + +```bash +docker run -it --rm gameservermanagers/steamcmd:latest +login