How can I use a variable inside a Dockerfile CMD?

Inside my Dockerfile:

ENV PROJECTNAME mytestwebsite
CMD ["django-admin", "startproject", "$PROJECTNAME"]


  • LDAP authentication in Docker container
  • What's the diff between Empty and No Value for Docker Volumes From?
  • Environment variables and @Value can't work together on Spring Boot
  • Docker container can't connect to DB on external network
  • Is Alpine Linux an implementation of a Unikernel?
  • Docker GitLab: Decoupling GitLab “external url” and “ssh port” from the GUI copy and paste links, web resources, certificates and actual ports
  • CommandError: '$PROJECTNAME' is not a valid project name

    What is the quickest workaround here? Does Docker have any plan to “fix” or introduce this functionality in later versions of Docker?

    NOTE: If I remove the CMD line from the Docker file and then run the Docker container, I am able to manually run Django-admin startproject $PROJECTNAME from inside the container and it will create the project…

  • How to COPY / ADD resources via a Dockerfile for privileged users?
  • How do you pass an environment variable to Solr running inside Docker when the environment variable only exists inside the container?
  • Mount directory to docker container while using CWL (Common Workflow Language)
  • Docker networking on single host with compose
  • Using a PostgreSQL database with Docker and Flask, how does it work?
  • docker containers static IP to communicate two different hosts
  • One Solution collect form web for “How can I use a variable inside a Dockerfile CMD?”

    When you use an execution list, as in…

    CMD ["django-admin", "startproject", "$PROJECTNAME"]

    …then Docker will execute the given command directly, without involving a shell. Since there is no shell involved, that means:

    • No variable expansion
    • No wildcard expansion
    • No i/o redirection with >, <, |, etc
    • No multiple commands via command1; command2
    • And so forth.

    If you want your CMD to expand variables, you need to arrange for a shell. You can do that like this:

    CMD ["sh", "-c" "django-admin startproject $PROJECTNAME"]

    Or you can use a simple string instead of an execution list, which gets you a result largely identical to the previous example:

    CMD django-admin startproject $PROJECTNAME
    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.