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.

  • Docker auto spawning required connected container types on demand
  • NSQ Docker Swarm
  • Docker logs not showing colors (express + nodejs image)
  • How do I pass environment variables to Docker containers?
  • Docker NGINX Proxy not Forwarding Websockets
  • Explanation about Supervisor and tail over Apache's error.log
  • 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”.

  • Docker unsupported manifest mediatype
  • How do I set environment variables during the build in docker
  • Running an iPython notebook server on an EC2 Ubuntu instance via Docker
  • Howto to start docker daemon under fedora, so that it is bound to tcp port
  • Docker: clean up all stopped containers except data-only containers
  • Docker -v paramter limited in size
  • 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.