2

我一直在尝试运行基本的 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
4

2 回答 2

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 图像是从头开始构建的。从码头中心:

“一个明确的空图像,特别是用于“从头开始”构建图像......

“此映像在构建基础映像(例如 debian 和 busybox)或超最小映像(仅包含单个二进制文件和所需的任何内容,例如 hello-world)的上下文中最有用。”

https://hub.docker.com/_/scratch

所以,我认为这张图片里面没有 bash

于 2019-10-22T20:25:50.433 回答
0

如果您从头开始检查基本图像。

FROM scratch
EXPOSE 8080 8081 8082 8083
COPY hotrod-linux /go/bin/
ENTRYPOINT ["/go/bin/hotrod-linux"]
CMD ["all"]

所以没有Bash, ash因为图像是从头开始的,所以它只会 cotnain 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
于 2019-10-22T20:25:32.457 回答