我一直在尝试运行基本的shell命令(以ls为例),但是它们中的任何一个都可以。 因此,我尝试验证容器是否启用了bash,并回答说要运行类似的帖子:
docker exec -it amazing_robinson //bin//bash
docker exec -it amazing_robinson /bin/bash
docker exec -it amazing_robinson //bin//sh
docker exec -it amazing_robinson /bin/sh
docker exec -it amazing_robinson sh
docker exec -it amazing_robinson bash
但是它们中的任何一个都起作用(docker exec -it amazing_robinson ls都不起作用)。
这是错误:
OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
容器是
jaegertracing/example-hotrod:latest
答案 0 :(得分:2)
FROM scratch
EXPOSE 8080 8081 8082 8083
COPY hotrod-linux /go/bin/
ENTRYPOINT ["/go/bin/hotrod-linux"]
CMD ["all"]
https://github.com/jaegertracing/jaeger/blob/master/examples/hotrod/Dockerfile
正如我所见,hotrod图像是从头开始构建的。并从docker hub:
”明确显示为空的图像,尤其是用于构建图像的“ FROM 划痕” ...
“此图像在构建基础图像时最有用 (例如debian和busybox)或超小型图像(包含 仅单个二进制文件以及所需的任何二进制文件(例如hello-world)。”
https://hub.docker.com/_/scratch
所以,我认为这张图片中没有bash
答案 1 :(得分:0)
如果您从头开始检查自己的base image。
FROM scratch
EXPOSE 8080 8081 8082 8083
COPY hotrod-linux /go/bin/
ENTRYPOINT ["/go/bin/hotrod-linux"]
CMD ["all"]
因此没有重击,灰烬,因为该图像是从头开始的,因此它只会残留hotrod-linux
。
在这种情况下,要获取sh或bash,您需要使用多阶段Dockerfile,可以在Dockerfile中使用基础映像,然后在Dockerfile中以多阶段从基础映像复制二进制文件。在这里
FROM jaegertracing/example-hotrod:latest as base
FROM alpine
COPY --from=base /go/bin/hotrod-linux /go/bin/hotrod-linux
ENTRYPOINT ["/go/bin/hotrod-linux"]
CMD ["all"]
所以现在您可以构建和测试,并且可以使用docker exec在容器内运行命令,这是示例
docker build -t myimage .
docker run -dit --name test myimage
#now run
docker exec -it test ash