Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
Docker

Docker: Fix an ENTRYPOINT and CMD Combination That Silently Ignores Arguments Passed at docker run

- 03.10.26 - ErcanOPAK

🐳 The Container That Never Heard a Word You Typed After the Image Name

ENTRYPOINT and CMD are meant to work together – ENTRYPOINT defines the fixed program that always runs, and CMD supplies default arguments to it that anyone can override by appending their own at the end of docker run. That handoff only works, though, when ENTRYPOINT is written in exec form (a JSON array). Written in shell form instead, Docker wraps it in /bin/sh -c, and anything you pass after the image name on the command line gets appended as a completely separate argument to the shell, not to your program – so it’s silently accepted by Docker and silently ignored by the application inside the container.

🔎 The Problem

# Shell form - this is the trap
ENTRYPOINT "myapp --config=/etc/myapp/default.yaml"

# docker run myimage --config=/etc/myapp/override.yaml
#
# Docker actually executes:
#   /bin/sh -c "myapp --config=/etc/myapp/default.yaml" --config=/etc/myapp/override.yaml
#
# The extra argument gets passed to /bin/sh itself, not to myapp -
# the shell ignores it (or errors, depending on the shell), and myapp
# runs with ONLY its hardcoded default config, no error reported.

✅ Fix: Use Exec Form for ENTRYPOINT So CMD Arguments Actually Reach the Program

  • Write ENTRYPOINT using the JSON array exec form – [“myapp”] instead of “myapp” – which runs the program directly (no intermediate shell) and correctly appends anything passed at docker run as real arguments to it.
  • Use CMD, also in exec form, to supply default arguments that complement the ENTRYPOINT – [“–config=/etc/myapp/default.yaml”] – so the combination behaves as intended: overridable defaults, not a fixed, unchangeable shell string.
  • If you genuinely need shell features (environment variable expansion, piping) in your entrypoint, use an explicit entrypoint script file instead of shell-form ENTRYPOINT, so you keep both the shell logic and correct argument handling.

⚠️ Why This Is Easy to Miss

  • docker run exits cleanly with no warning about the ignored arguments – the container starts, the application runs, just with configuration nobody intended, which looks like an application-level config bug rather than a Dockerfile syntax choice.
  • The Dockerfile reads perfectly naturally to anyone unfamiliar with the shell-form-versus-exec-form distinction, since both forms are valid Docker syntax and neither one is flagged as deprecated or incorrect by any tooling.

Shell-form ENTRYPOINT doesn’t run your program – it runs a shell that runs your program, and anything you hand to docker run afterward is arguing with the wrong listener.

— DevOps Engineer

Related posts:

Docker: Manage Networks with Docker Compose

Docker: Use Multi-Stage Builds to Reduce Final Image Size by 90%

Docker: Use .dockerignore to Exclude Unnecessary Files

Post Views: 3

Post navigation

Git: Recover a Commit Lost After an Interactive Rebase Accidentally Drops It
Git: Fix a Sparse Checkout That Silently Hides Files You Expect to See in Your Working Directory

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (950)
  • How to add default value for Entity Framework migrations for DateTime and Bool (938)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (836)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (950)
  • How to add default value for Entity Framework migrations for DateTime and Bool (938)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (836)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com