Docker: ENTRYPOINT can't execute command because it doesn't find the file

I’m trying to create a container from node js image and I have configured my Dockerfile as shown:

FROM node:boron

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app
RUN npm install

# Bundle app source
COPY . /usr/src/app

VOLUME ./:/usr/src/app
ENTRYPOINT [ "npm run watch" ]

In the package.json I have a script called watch than runs the gulp task named watch-less.

  • How to make `docker run` inherit ulimits
  • fork/exec ./debug: operation not permitted
  • docker memory-swap=-1 OOM
  • Can I schedule Docker to run on specific time on Amazon ECS?
  • Docker(compose) installing nodejs broke npm
  • Docker wordpress multisite with subdomains
  • If I run npm run watch in my local environment the command works but when I try running the container it doesn’t and shows the next error:

    docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused “exec: \”npm run watch\”: executable file not found in $PATH”.

  • Does Kitematic 0.7.6 for Windows support Volumes?
  • Hashes in `docker pull wordpress`
  • How to bundle docker toolbox, dockerfile, docker-compose file inside a executable file?
  • ECS: Environment variables set in task but not present in container
  • Multiple Dockerfiles in project
  • How to setup sentry with docker
  • 2 Solutions collect form web for “Docker: ENTRYPOINT can't execute command because it doesn't find the file”

    ENTRYPOINT [ "npm run watch" ]
    

    This is an incorrect json syntax, it’s looking for the executable npm run watch, not the executable npm with parameters run and watch:

    With the json syntax you need to separate each argument. You can use the shell syntax:

    ENTRYPOINT npm run watch
    

    Or you can update the json syntax like (assuming npm is installed in /usr/bin):

    ENTRYPOINT [ "/usr/bin/npm", "run", "watch" ]
    

    You also have an incorrect volume definition:

    VOLUME ./:/usr/src/app
    

    Dockerfiles cannot specify the how the volume is mounted to the host, only that an anonymous volume is defined at a specific directory location. With a syntax like:

    VOLUME /usr/src/app
    

    I’ve got strong opinions against using a volume definition inside of the Dockerfile described in this blog post. In short, you can define the volume better in a docker-compose.yml, all you can do with a Dockerfile is create anonymous volumes that you’d need to still redefine elsewhere if you want to be able to easily reuse them later.

    If you use the list notation for ENTRYPOINT, that is, with the [brackets], you must separate the arguments properly.

    ENTRYPOINT ["npm", "run", "watch"]
    

    Right now it is trying to find a file literally named “npm run watch” and that does not exist.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.