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.

  • Ansible docker_container 'no Host in request URL', docker pull works correctly
  • Using host env variable with docker remote API
  • Jenkins build parameter not working in quotes
  • how to create a docker image/container with same file rights as host user
  • Running tests in a container on Travis
  • How do I enable the Docker RestAPI on Windows Containers?
  • 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”.

  • How to mimic Travis CI locally?
  • unable to find user root: no matching entries in passwd file
  • Logging solution for multiple containers running on same host
  • How to test external services from inside a Docker container?
  • How to get services and its status inside the docker containers?
  • dockerized django: static tag in templates not detecting the present static files
  • 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.