executable file not found in $PATH Dockerfile

16,079

You misunderstood volumes in Docker I think. (see What is the purpose of VOLUME in Dockerfile)

I'm citing @VonC answer:

A volume is a persistent data stored in /var/lib/docker/volumes/...

  • You can either declare it in a Dockerfile, which means each time a container is stated from the image, the volume is created (empty), even if you don't have any -v option.

  • You can declare it on runtime docker run -v [host-dir:]container-dir. combining the two (VOLUME + docker run -v) means that you can mount the content of a host folder into your volume persisted by the container in /var/lib/docker/volumes/....

  • docker volume create creates a volume without having to define a Dockerfile and build an image and run a container. It is used to quickly allow other containers to mount said volume.

So you should use docker run -v /home/user/Documents/folder1/folder2/folder3/Projectname:/workdir1 when starting the container

And your Dockerfile volume declaration should be:

VOLUME /workdir1

That being said, you define both Entrypoint and CMD. What is the CMD being for ? You will never use your image without using runapp.sh ? I prefer using only CMD for development since you can still do docker run -it my_container bash for debugging purpose with this syntax.

This time I'm using @Daishi answer from What is the difference between CMD and ENTRYPOINT in a Dockerfile?

The ENTRYPOINT specifies a command that will always be executed when the container starts.

The CMD specifies arguments that will be fed to the ENTRYPOINT.

If you want to make an image dedicated to a specific command you will use ENTRYPOINT ["/path/dedicated_command"]

Otherwise, if you want to make an image for general purpose, you can leave ENTRYPOINT unspecified and use CMD ["/path/dedicated_command"] as you will be able to override the setting by supplying arguments to docker run

Moreover, runapp.sh isn't in your $PATH and you call it without absolute path, so it will not find the file even if the volume is mounted correctly. You could just use:

CMD /workdir1/runapp.sh "$NEO4J_CONFIG" "$BENCHMARK_NAME"

Now be careful, on your host you mention that the shell script is named script.sh and you call runapp.sh in your Dockerfile, I hope it's a typo. By the way your script needs to be executable.

Share:
16,079
Cassie
Author by

Cassie

Data Engineer

Updated on June 06, 2022

Comments

  • Cassie
    Cassie almost 2 years

    I am building a Dockerfile for an application. I want to execute a bash script with parameters when the container starts to run, so I have made it an entry point. However, Docker cannot find the directory in which my script is located. Thi script is located in the Intellij Idea project folder and the path practically looks like this: /home/user/Documents/folder1/folder2/folder3/Projectname/runapp.sh

    I have tried to mount this directory as volume, but while running built image an error occurred:

    docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"runapp.sh\": executable file not found in $PATH": unknown.
    

    What may be the reason of such behavior? How else can I reach this bash script from Dockerfile?

    Here is how the Dockerfile looks like:

    FROM java:8
    
    ENV SCALA_VERSION 2.11.8
    ENV SBT_VERSION 1.1.1
    ENV SPARK_VERSION 2.2.0
    ENV SPARK_DIST spark-$SPARK_VERSION-bin-hadoop2.6
    ENV SPARK_ARCH $SPARK_DIST.tgz
    ENV NEO4J_CONFIG default
    ENV BENCHMARK_NAME default
    
    WORKDIR /opt
    
    # Install Scala
    RUN \
      cd /root && \
      curl -o scala-$SCALA_VERSION.tgz http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz && \
      tar -xf scala-$SCALA_VERSION.tgz && \
      rm scala-$SCALA_VERSION.tgz && \
      echo >> /root/.bashrc && \
      echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc
    
    # Install SBT
    RUN \
      curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \
      dpkg -i sbt-$SBT_VERSION.deb && \
      rm sbt-$SBT_VERSION.deb
    
    # Install Spark
    RUN \
        cd /opt && \
        curl -o $SPARK_ARCH http://d3kbcqa49mib13.cloudfront.net/$SPARK_ARCH && \
        tar xvfz $SPARK_ARCH && \
        rm $SPARK_ARCH && \
        echo 'export PATH=$SPARK_DIST/bin:$PATH' >> /root/.bashrc
    
    EXPOSE 9851 9852 4040 7474 7687 7473
    
    VOLUME /home/user/Documents/folder1/folder2/folder3/Projectname /workdir1
    
    WORKDIR /workdir1
    
    ENTRYPOINT ["runapp.sh"]
    
    CMD ["$NEO4J_CONFIG", "$BENCHMARK_NAME"]