docker: executable file not found in $PATH

后端 未结 10 990
刺人心
刺人心 2020-11-28 02:02

I have a docker image which installs grunt, but when I try to run it, I get an error:

Error response from daemon: Cannot start container foo_1         


        
相关标签:
10条回答
  • 2020-11-28 02:43

    I had the same problem, After lots of googling, I couldn't find out how to fix it.

    Suddenly I noticed my stupid mistake :)

    As mentioned in the docs, the last part of docker run is the command you want to run and its arguments after loading up the container.

    NOT THE CONTAINER NAME !!!

    That was my embarrassing mistake.

    Below I provided you with the picture of my command line to see what I have done wrong.

    And this is the fix as mentioned in the docs.

    0 讨论(0)
  • 2020-11-28 02:44

    problem is glibc, which is not part of apline base iamge.

    After adding it worked for me :)

    Here are the steps to get the glibc

    apk --no-cache add ca-certificates wget
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk
    apk add glibc-2.28-r0.apk
    
    0 讨论(0)
  • 2020-11-28 02:48

    to make it work add soft reference to /usr/bin:

    ln -s $(which node) /usr/bin/node

    ln -s $(which npm) /usr/bin/npm

    0 讨论(0)
  • 2020-11-28 02:49

    In the error message shown:

    Error response from daemon: Cannot start container foo_1: \
        exec: "grunt serve": executable file not found in $PATH
    

    It is complaining that it cannot find the executable grunt serve, not that it could not find the executable grunt with the argument serve. The most likely explanation for that specific error is running the command with the json syntax:

    [ "grunt serve" ]
    

    in something like your compose file. That's invalid since the json syntax requires you to split up each parameter that would normally be split by the shell on each space for you. E.g.:

    [ "grunt", "serve" ]
    

    The other possible way you can get both of those into a single parameter is if you were to quote them into a single arg in your docker run command, e.g.

    docker run your_image_name "grunt serve"
    

    and in that case, you need to remove the quotes so it gets passed as separate args to the run command:

    docker run your_image_name grunt serve
    

    For others seeing this, the executable file not found means that Linux does not see the binary you are trying to run inside your container with the default $PATH value. That could mean lots of possible causes, here are a few:

    • Did you remember to include the binary inside your image? If you run a multi-stage image, make sure that binary install is run in the final stage. Run your image with an interactive shell and verify it exists:

      docker run -it --rm your_image_name /bin/sh
      
    • Your path when shelling into the container may be modified for the interactive shell, particularly if you use bash, so you may need to specify the full path to the binary inside the container, or you may need to update the path in your Dockerfile with:

      ENV PATH=$PATH:/custom/dir/bin
      
    • The binary may not have execute bits set on it, so you may need to make it executable. Do that with chmod:

      RUN chmod 755 /custom/dir/bin/executable
      
    • If you run the image with a volume, that volume can overlay the directory where the executable exists in your image. Volumes do not merge with the image, they get mounted in the filesystem tree same as any other Linux filesystem mount. That means files from the parent filesystem at the mount point are no longer visible. (Note that named volumes are initialized by docker from the image content, but this only happens when the named volume is empty.) So the fix is to not mount volumes on top of paths where you have executables you want to run from the image.

    0 讨论(0)
提交回复
热议问题