Skip to content

Comments

Docker image support added.#325

Merged
cinar merged 2 commits intomasterfrom
issue-288
Feb 23, 2026
Merged

Docker image support added.#325
cinar merged 2 commits intomasterfrom
issue-288

Conversation

@cinar
Copy link
Owner

@cinar cinar commented Feb 22, 2026

Describe Request

Docker image support added.

Fixed #288

Change Type

New feature.

Summary by CodeRabbit

  • New Features

    • Docker containerization for easy deployment, including containerized builds of the app and runtime.
    • Automated CI/CD publishing of Docker images on release tags.
    • Container entrypoint to run data synchronization and backtests with configurable options (API key, timeframe, asset selection, output location).
  • Documentation

    • Added Docker quick start, usage examples, and local build workflow to the README.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 22, 2026

📝 Walkthrough

Walkthrough

Adds Docker support: a multi-stage Dockerfile building two Go binaries, a docker-entrypoint.sh to orchestrate sync+backtest runs, a GitHub Actions workflow to build and push images to ghcr.io on tagged releases, and Docker usage documentation in README (quick start and local build).

Changes

Cohort / File(s) Summary
CI / Registry workflow
.github/workflows/docker.yml
Adds GitHub Actions workflow that runs on push tags v*, sets up buildx, logs into ghcr.io, generates metadata, and build-pushes Docker images with semver and latest tags and caching.
Container image build
Dockerfile
New multi-stage Dockerfile: builder (golang:1.22-alpine) compiles indicator-sync and indicator-backtest; final stage (alpine:3.19) installs ca-certificates, creates app dirs, adds non-root user, copies binaries and entrypoint, and sets ENTRYPOINT.
Runtime orchestration
docker-entrypoint.sh
New entrypoint script parsing CLI flags (--api-key, --days, --last, --assets, --output), validates/masks API key, performs data sync then backtests, creates output dirs, and prints final report location.
Docs
README.md
Adds a Docker section with quick start, options/examples, and local build instructions for building and running the image.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant User
participant GitHubActions as "GitHub Actions\n(runner)"
participant Buildx as "Docker Buildx"
participant GHCR as "GitHub Container Registry\n(ghcr.io)"
participant Image as "Docker Image\n(indicator app)"
User->>GitHubActions: push tag vX.Y.Z
GitHubActions->>Buildx: setup buildx, generate metadata
GitHubActions->>GHCR: login with GITHUB_TOKEN
GitHubActions->>Buildx: build and push image (semver, latest)
Buildx->>GHCR: push image artifacts
GHCR-->>User: image available
User->>Image: run container (docker run) -> container starts entrypoint
Image->>Image: entrypoint runs sync then backtest using provided flags

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 In a burrow of code I hum and hop,
I pack two bins and seal the top,
Tags push, images glide away,
Sync then test — reports on display,
A cozy build, now ship and stop!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Docker image support added' clearly and concisely describes the main change in the pull request, which is the addition of Docker image support.
Description check ✅ Passed The pull request description follows the repository template with all required sections: 'Describe Request', 'Fixed #288', and 'Change Type: New feature' are all present and complete.
Linked Issues check ✅ Passed The pull request fully addresses issue #288 requirements by providing a Dockerfile, workflow, entrypoint script, and documentation for building and deploying Docker images with all necessary dependencies.
Out of Scope Changes check ✅ Passed All changes are directly related to Docker image support as specified in issue #288; no out-of-scope modifications are present in the pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch issue-288

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov-commenter
Copy link

codecov-commenter commented Feb 22, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 88.99%. Comparing base (029ada2) to head (7032c02).

❌ Your project status has failed because the head coverage (88.99%) is below the target coverage (90.00%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files
@@            Coverage Diff             @@
##           master     #325      +/-   ##
==========================================
+ Coverage   88.89%   88.99%   +0.10%     
==========================================
  Files         205      205              
  Lines        5761     5761              
==========================================
+ Hits         5121     5127       +6     
+ Misses        567      563       -4     
+ Partials       73       71       -2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (1)
.github/workflows/docker.yml (1)

31-33: Pre-release tags will overwrite :latest.

Any v* push — including v2.0.0-beta or v1.0.0-rc1 — unconditionally updates the latest tag. Consider gating the latest tag on stable semver tags only (no pre-release suffix).

💡 Example using `docker/metadata-action` to control tag promotion
      - name: Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ghcr.io/cinar/indicator
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}},enable=${{ !startsWith(github.ref, 'refs/tags/v0.') }}
            type=raw,value=latest,enable=${{ !contains(github.ref_name, '-') }}

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/docker.yml around lines 31 - 33, The workflow currently
always pushes ghcr.io/cinar/indicator:latest (via the tags block referencing
github.ref_name), which lets pre-release tags overwrite :latest; change the
tagging step to gate the latest tag to stable semver only — e.g. replace the
static tags block with a docker/metadata-action invocation
(docker/metadata-action@v5) to generate tags and only enable the raw latest tag
when the tag name has no pre-release suffix (use a condition like enable=${{
!contains(github.ref_name, '-') }}), then pass the generated tags
(steps.meta.outputs.tags) into docker/build-push-action so pre-release refs
(e.g. v2.0.0-beta) do not set :latest.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/docker.yml:
- Around line 27-35: The workflow uses docker/build-push-action@v5 which lacks
support required for GitHub Cache API v2; update the action reference to
docker/build-push-action@v6 in the job that includes the uses: line, and ensure
your workflow uses a recent buildx/BuildKit (BuildKit ≥ 0.20.0 and buildx ≥
0.21.0) via the action inputs or preceding setup-steps so the
cache-from/type=gha and cache-to/type=gha settings work with v2.

In `@docker-entrypoint.sh`:
- Line 80: The current echo prints the full API_KEY (echo "  API Key:
***${API_KEY:-none}") leaking secrets; change the echo to avoid printing the raw
value by replacing it with a masked or redacted representation: compute a masked
string from API_KEY (e.g., show "<redacted>" or build a mask that keeps only the
last 4 characters and replaces the rest with asterisks) and use that masked
variable in the echo, referencing the API_KEY variable and the echo statement so
the full secret is never emitted to stdout.
- Around line 48-51: The --assets case in docker-entrypoint.sh currently sets
ASSETS="$2" and shift 2 which only captures one token; change the --assets case
to collect all subsequent non-flag tokens into ASSETS (e.g., loop reading "$2"
while it does not start with '-' and append to ASSETS), advancing shifts for
each consumed token, then continue the outer argument parsing; update the case
label handling for --assets and ensure ASSETS ends up as a space-separated list
of all provided assets.

In `@Dockerfile`:
- Around line 11-13: The Dockerfile currently copies only go.mod and runs "go
mod download", which omits checksum verification; update the COPY instruction
that references "go.mod" (and the subsequent RUN "go mod download") to also copy
"go.sum" into the build context (e.g., change the COPY that targets go.mod to
include go.sum or use a wildcard like go.*) so that the build uses the lockfile
and preserves module checksum verification and reproducible builds.
- Around line 20-34: The container currently runs as root; create a non-root
user and run the image as that user by adding a USER creation step (e.g.,
addgroup/adduser or useradd) and switching to that user after preparing files
but before ENTRYPOINT; ensure /app/data and /app/output are owned by that user
(chown those paths) so the entrypoint script (docker-entrypoint.sh) and the
applications (indicator-sync, indicator-backtest) remain executable and writable
by the non-root user, and keep ENTRYPOINT ["docker-entrypoint.sh"] unchanged.

In `@README.md`:
- Around line 263-264: The README currently instructs macOS users to run "open
output/index.html" which is platform-specific; update that line to be
cross-platform by documenting both commands (e.g., "open output/index.html" for
macOS and "xdg-open output/index.html" for Linux) or provide a platform-agnostic
suggestion such as "use your browser to open output/index.html" so Linux users
are not blocked; make the change where the README contains the "open
output/index.html" instruction.

---

Nitpick comments:
In @.github/workflows/docker.yml:
- Around line 31-33: The workflow currently always pushes
ghcr.io/cinar/indicator:latest (via the tags block referencing github.ref_name),
which lets pre-release tags overwrite :latest; change the tagging step to gate
the latest tag to stable semver only — e.g. replace the static tags block with a
docker/metadata-action invocation (docker/metadata-action@v5) to generate tags
and only enable the raw latest tag when the tag name has no pre-release suffix
(use a condition like enable=${{ !contains(github.ref_name, '-') }}), then pass
the generated tags (steps.meta.outputs.tags) into docker/build-push-action so
pre-release refs (e.g. v2.0.0-beta) do not set :latest.

echo "=========================================="
echo ""
echo "Configuration:"
echo " API Key: ***${API_KEY:-none}"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

API key is not masked — full key printed to stdout.

***${API_KEY:-none} expands to ***<the-actual-key>, leaking the secret to any log aggregator or terminal recording. The *** prefix is cosmetic only.

🔒 Proposed fix
-echo "  API Key: ***${API_KEY:-none}"
+echo "  API Key: ***"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
echo " API Key: ***${API_KEY:-none}"
echo " API Key: ***"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docker-entrypoint.sh` at line 80, The current echo prints the full API_KEY
(echo "  API Key: ***${API_KEY:-none}") leaking secrets; change the echo to
avoid printing the raw value by replacing it with a masked or redacted
representation: compute a masked string from API_KEY (e.g., show "<redacted>" or
build a mask that keeps only the last 4 characters and replaces the rest with
asterisks) and use that masked variable in the echo, referencing the API_KEY
variable and the echo statement so the full secret is never emitted to stdout.

Comment on lines +11 to +13
COPY go.mod ./

RUN go mod download
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

go.sum must be copied alongside go.mod.

Without go.sum, go mod download skips checksum verification and Go regenerates the lock file during the build, breaking reproducibility and bypassing module integrity guarantees.

🐛 Proposed fix
-COPY go.mod ./
+COPY go.mod go.sum ./
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
COPY go.mod ./
RUN go mod download
COPY go.mod go.sum ./
RUN go mod download
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dockerfile` around lines 11 - 13, The Dockerfile currently copies only go.mod
and runs "go mod download", which omits checksum verification; update the COPY
instruction that references "go.mod" (and the subsequent RUN "go mod download")
to also copy "go.sum" into the build context (e.g., change the COPY that targets
go.mod to include go.sum or use a wildcard like go.*) so that the build uses the
lockfile and preserves module checksum verification and reproducible builds.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
docker-entrypoint.sh (1)

96-132: Unquoted $ASSETS is subject to glob expansion.

The word-splitting behavior is intentional (POSIX sh has no arrays), but unquoted $ASSETS also undergoes pathname expansion. A ticker like c or t that matches a filename in the working directory would silently expand to filesystem paths instead of being passed as the ticker symbol. To split on spaces but not perform glob expansion, POSIX has set -f to disable globbing.

♻️ Proposed fix — guard both invocations with `set -f` / `set +f`
 else
+    set -f
+    # shellcheck disable=SC2086
     ./indicator-sync \
         -source-name tiingo \
         -source-config "$API_KEY" \
         -target-name filesystem \
         -target-config "$DATA_DIR" \
         -days "$DAYS" \
         $ASSETS
+    set +f
 fi

Apply the same wrapping to the indicator-backtest invocation on lines 125-132.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docker-entrypoint.sh` around lines 96 - 132, The unquoted $ASSETS can undergo
pathname (glob) expansion; wrap the conditional invocations that pass $ASSETS to
./indicator-sync and ./indicator-backtest with a temporary globbing disable:
before calling either command when $ASSETS is used, run set -f to disable
pathname expansion, invoke ./indicator-sync or ./indicator-backtest with the
unquoted $ASSETS, then run set +f to restore globbing; target the two call sites
that reference $ASSETS (the ./indicator-sync and ./indicator-backtest branches)
so word-splitting remains but glob expansion is prevented.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docker-entrypoint.sh`:
- Around line 40-47: The flags parsing for --days and --last in
docker-entrypoint.sh currently assigns raw $2 to DAYS and LAST without
validation; add POSIX-compatible checks in the argument-handling branch for
these flags to ensure $2 exists and matches a positive-integer regex (e.g.
'^[0-9]+$'), otherwise print a clear user-friendly error mentioning the flag
(e.g. "--days requires a positive integer") to stderr and exit with a non-zero
status; update the --days and --last branches to validate $2 before assigning to
DAYS/LAST and shift only after successful validation.
- Around line 48-55: The --assets handling loop currently leaves ASSETS empty
when no tickers follow, causing later code to treat it as “all assets”; after
the while loop that builds ASSETS (the block using ASSETS="" and while [ $# -gt
0 ] && [ "${1#-}" = "$1" ]; do ... done), add an explicit check if [ -z
"$ASSETS" ] then print an error to stderr (e.g. echo "Error: --assets requires
at least one ticker" >&2) and exit 1 so the script fails fast when --assets is
provided with no arguments.

In `@README.md`:
- Around line 298-304: The example under "Custom output directory" redundantly
passes the default --output value; either remove the --output /app/output
argument or change it to a non-default container path to demonstrate real
customization. Update the README example by removing the --output flag so the
host mount (-v /path/to/my/reports:/app/output) is the only change, or
alternatively set the container path in the flag to something different (e.g.,
--output /custom/output) and adjust the volume mount accordingly; reference the
example's docker run command and the --output flag when making the edit.

---

Nitpick comments:
In `@docker-entrypoint.sh`:
- Around line 96-132: The unquoted $ASSETS can undergo pathname (glob)
expansion; wrap the conditional invocations that pass $ASSETS to
./indicator-sync and ./indicator-backtest with a temporary globbing disable:
before calling either command when $ASSETS is used, run set -f to disable
pathname expansion, invoke ./indicator-sync or ./indicator-backtest with the
unquoted $ASSETS, then run set +f to restore globbing; target the two call sites
that reference $ASSETS (the ./indicator-sync and ./indicator-backtest branches)
so word-splitting remains but glob expansion is prevented.

Comment on lines +40 to +47
--days)
DAYS="$2"
shift 2
;;
--last)
LAST="$2"
shift 2
;;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

--days and --last accept non-numeric values without user-friendly error.

There is no validation that $2 is a positive integer for either flag. A typo (e.g., --days foo) or omitting the value (e.g., --days as the final argument) silently passes an empty or non-numeric string to the Go binary, producing a cryptic flag-parse error rather than a friendly message.

🛡️ Proposed fix — add POSIX-compatible numeric validation
         --days)
+            case "$2" in
+                ''|*[!0-9]*) echo "Error: --days must be a positive integer"; exit 1 ;;
+            esac
             DAYS="$2"
             shift 2
             ;;
         --last)
+            case "$2" in
+                ''|*[!0-9]*) echo "Error: --last must be a positive integer"; exit 1 ;;
+            esac
             LAST="$2"
             shift 2
             ;;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
--days)
DAYS="$2"
shift 2
;;
--last)
LAST="$2"
shift 2
;;
--days)
case "$2" in
''|*[!0-9]*) echo "Error: --days must be a positive integer"; exit 1 ;;
esac
DAYS="$2"
shift 2
;;
--last)
case "$2" in
''|*[!0-9]*) echo "Error: --last must be a positive integer"; exit 1 ;;
esac
LAST="$2"
shift 2
;;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docker-entrypoint.sh` around lines 40 - 47, The flags parsing for --days and
--last in docker-entrypoint.sh currently assigns raw $2 to DAYS and LAST without
validation; add POSIX-compatible checks in the argument-handling branch for
these flags to ensure $2 exists and matches a positive-integer regex (e.g.
'^[0-9]+$'), otherwise print a clear user-friendly error mentioning the flag
(e.g. "--days requires a positive integer") to stderr and exit with a non-zero
status; update the --days and --last branches to validate $2 before assigning to
DAYS/LAST and shift only after successful validation.

Comment on lines +48 to +55
--assets)
shift
ASSETS=""
while [ $# -gt 0 ] && [ "${1#-}" = "$1" ]; do
ASSETS="${ASSETS:+$ASSETS }$1"
shift
done
;;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

--assets with no following tickers silently falls back to "all assets."

When --assets is the last argument (or is immediately followed by another flag), the inner loop exits with ASSETS="". The later if [ -z "$ASSETS" ] check then silently runs for all assets, contrary to what the user likely intended. An explicit error here prevents silent misuse.

🛡️ Proposed fix — error when no tickers follow `--assets`
         --assets)
             shift
             ASSETS=""
             while [ $# -gt 0 ] && [ "${1#-}" = "$1" ]; do
                 ASSETS="${ASSETS:+$ASSETS }$1"
                 shift
             done
+            if [ -z "$ASSETS" ]; then
+                echo "Error: --assets requires at least one ticker symbol"
+                show_usage
+                exit 1
+            fi
             ;;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
--assets)
shift
ASSETS=""
while [ $# -gt 0 ] && [ "${1#-}" = "$1" ]; do
ASSETS="${ASSETS:+$ASSETS }$1"
shift
done
;;
--assets)
shift
ASSETS=""
while [ $# -gt 0 ] && [ "${1#-}" = "$1" ]; do
ASSETS="${ASSETS:+$ASSETS }$1"
shift
done
if [ -z "$ASSETS" ]; then
echo "Error: --assets requires at least one ticker symbol"
show_usage
exit 1
fi
;;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docker-entrypoint.sh` around lines 48 - 55, The --assets handling loop
currently leaves ASSETS empty when no tickers follow, causing later code to
treat it as “all assets”; after the while loop that builds ASSETS (the block
using ASSETS="" and while [ $# -gt 0 ] && [ "${1#-}" = "$1" ]; do ... done), add
an explicit check if [ -z "$ASSETS" ] then print an error to stderr (e.g. echo
"Error: --assets requires at least one ticker" >&2) and exit 1 so the script
fails fast when --assets is provided with no arguments.

Comment on lines +298 to +304
# Custom output directory
docker run -it --rm \
-v /path/to/my/reports:/app/output \
ghcr.io/cinar/indicator:latest \
--api-key YOUR_TIINGO_API_KEY \
--output /app/output
```
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

"Custom output directory" example redundantly passes the default --output value.

The --output /app/output argument on Line 303 restates the default, adding no new information. The example's actual customization is the host-side volume mount (-v /path/to/my/reports:/app/output), which works identically without the --output flag. Either drop the flag or show a non-default container path to make the example meaningful.

📝 Option A — remove the redundant flag
 # Custom output directory
 docker run -it --rm \
   -v /path/to/my/reports:/app/output \
   ghcr.io/cinar/indicator:latest \
-  --api-key YOUR_TIINGO_API_KEY \
-  --output /app/output
+  --api-key YOUR_TIINGO_API_KEY
📝 Option B — demonstrate a genuinely custom container-side path
 # Custom output directory
 docker run -it --rm \
-  -v /path/to/my/reports:/app/output \
+  -v /path/to/my/reports:/app/reports \
   ghcr.io/cinar/indicator:latest \
   --api-key YOUR_TIINGO_API_KEY \
-  --output /app/output
+  --output /app/reports
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Custom output directory
docker run -it --rm \
-v /path/to/my/reports:/app/output \
ghcr.io/cinar/indicator:latest \
--api-key YOUR_TIINGO_API_KEY \
--output /app/output
```
# Custom output directory
docker run -it --rm \
-v /path/to/my/reports:/app/output \
ghcr.io/cinar/indicator:latest \
--api-key YOUR_TIINGO_API_KEY
Suggested change
# Custom output directory
docker run -it --rm \
-v /path/to/my/reports:/app/output \
ghcr.io/cinar/indicator:latest \
--api-key YOUR_TIINGO_API_KEY \
--output /app/output
```
# Custom output directory
docker run -it --rm \
-v /path/to/my/reports:/app/reports \
ghcr.io/cinar/indicator:latest \
--api-key YOUR_TIINGO_API_KEY \
--output /app/reports
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 298 - 304, The example under "Custom output
directory" redundantly passes the default --output value; either remove the
--output /app/output argument or change it to a non-default container path to
demonstrate real customization. Update the README example by removing the
--output flag so the host mount (-v /path/to/my/reports:/app/output) is the only
change, or alternatively set the container path in the flag to something
different (e.g., --output /custom/output) and adjust the volume mount
accordingly; reference the example's docker run command and the --output flag
when making the edit.

@cinar cinar merged commit 5a9cf7c into master Feb 23, 2026
6 checks passed
@cinar cinar deleted the issue-288 branch February 23, 2026 00:29
@github-actions github-actions bot locked and limited conversation to collaborators Feb 23, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Request for Docker Image for Indicator Go

2 participants