I have been trying to create my own busybox base image.
# ./mkimage.sh -t pensu/busybox busybox-static
+ mkdir -p /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ tar --numeric-owner -caf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs.tar.xz -C /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs '--transform=s,^./,,' .
+ cat > '/var/tmp/docker-mkimage.US3tHy0uBQ/Dockerfile'
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ/rootfs
+ docker build -t pensu/busybox /var/tmp/docker-mkimage.US3tHy0uBQ
Sending build context to Docker daemon 863.2 kB
Sending build context to Docker daemon
Step 0 : FROM scratch
--->
Step 1 : ADD rootfs.tar.xz /
---> 8eac78bfc9d6
Removing intermediate container ad9bbb8f7536
Successfully built 8eac78bfc9d6
+ rm -rf /var/tmp/docker-mkimage.US3tHy0uBQ
I can see the image is available with my docker repo.
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
pensu/busybox latest 8eac78bfc9d6 7 seconds ago 2.476 MB
But when I try to do docker run, I always get the error:
# docker run -it pensu/busybox /bin/sh
exec: "/bin/sh": stat /bin/sh: no such file or directorytime="2015-04-09T16:03:45+05:30" level="fatal" msg="Error response from daemon: Cannot start container 8fe73b7832193c847d7975175a4be86d1f0b550b6a00b812bd4cdd18fe752468: exec: \"/bin/sh\": stat /bin/sh: no such file or directory"
I am not able to understand why is it giving that error? Am I doing something wrong? How else can I validate that I am creating a correct image that is in working condition?
8 Answers 8
After you create image, check it with:
$ docker inspect $image_name
and check what you have in CMD option. For busy box it should be:
"Cmd": [
"/bin/sh"
]
Maybe you are overwritting CMD option in your ./mkimage.sh
8 Comments
"Cmd": [ "/bin/sh", "-c", "#(nop) ADD file:905ed83e56295de9b6eb24708b583e78e4e9a06d3a80184276b55b5db04d70aa in /" ] - notice the ADD stuff; you have a typo in your Dockerfile.Using $ docker inspect [imageID] Incase the Image has no /bin/bash in the output, you can use command below: it worked for me perfectly
$ docker exec -it <container id> sh
The -it flags let you interact with a container by allocating a pseudo-tty and keeping stdin open.
1 Comment
I hit this error ("stat /bin/bash: no such file or directory") when running the command:
docker exec -it 80372bc2c41e /bin/bash
The solution was to identify the kind of terminal (or shell) that is available on the container. To do so, I ran:
docker inspect 80372bc2c41e
In the output from that command, I saw:
"Cmd": [
"/bin/sh",
"-c",
"gunicorn -b 0.0.0.0:7082 server.app:app"
],
This tells me that there's a /bin/sh command available, and I was able to connect with:
docker exec -it 80372bc2c41e /bin/sh
This error
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/bin/sh\": stat /bin/sh: no such file or directory": unknown.
occurs when creating a docker image from base image eg. scratch. This is because the resulting image does not have a shell to execute the image. If your use:
ENV EXECUTABLE hello
cmd [$EXECUTABLE]
in your docker file, docker uses /bin/sh to parse the input string. and hence the error. Inspecting on the image, your will find:
$docker inspect <image-name>
"Entrypoint": [
"/bin/sh",
"-c",
"[$HM_APP]"
]
This means that the ENTRYPOINT or CMD arguments will be parsed using /bin/sh -c. The solution that worked for me is to parse the command as a JSON array of string e.g.
cmd ["hello"]
and inspecting the image again:
"Entrypoint": [
"hello"
]
This removes the dependence on /bin/sh the docker app can now execute the binary file. Example:
FROM scratch
# Environmental variables
# Copy files
ADD . /
# Home dir
WORKDIR /bin
EXPOSE 8083
ENTRYPOINT ["hospitalms"]
Hope this helps someone in future.
3 Comments
As of Docker 1.5.0 (specifically, docker/docker#8827), FROM scratch is a no-op in the Dockerfile. Using the scratch "image" signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image. This means that your container does not contain /bin/sh, or anything else (other than the linux kernel i assume)WORKDIR /bin in my Dokerfile solve for meOn Windows (msys) using Docker Toolbox/Machine, I had to add an extra / before /bin/bash to indicate that it was a *nix filepath.
So,
docker run --rm -it <image>:latest //bin/bash
1 Comment
check your image cmd using the command docker inspect image_name . The output might be like this:
"Cmd": [
"/bin/bash",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
So use the command docker exec -it container_id /bin/bash. If your cmd output is different like this:
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/sh\"]"
],
Use /bin/sh instead of /bin/bash in the command above.
Comments
I had a similar problem:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown.
In my case, I know the image works in other places, then was a corrupted local image.
I solved the issue removing the image (docker rmi <imagename>) and pulling it again(docker pull <imagename>).
I did a docker system prune too, but I think it's not mandatory.
Comments
Explicitly mention the ubuntu version in the docker file which you are trying to RUN,
FROM ubuntu:14.04
Dont use like FROM ubuntu:Latest. This resolved my above "Cannot Start Container: stat /bin/sh: no such file or directory" issue
WORKDIR, and I had aCOPY . .which was using my local./binto overwrite/binin the container.