Docker“在$ PATH中找不到可执行文件”,即使它已添加到基础映像的路径中?

时间:2019-10-12 20:01:20

标签: docker dockerfile

我想修改此图像https://hub.docker.com/r/micromdm/scep,以运行scepclient而不是scepserver。图片的Dockerfile为:

FROM alpine:3.6

COPY ./build/scepserver-linux-amd64 /usr/bin/scepserver
COPY ./build/scepclient-linux-amd64 /usr/bin/scepclient

EXPOSE 8080

ENTRYPOINT ["scepserver"]

我希望ENTRYPOINT["scepclient"]而不是["scepserver"],而我尝试使用以下Dockerfile来做到这一点:

FROM micromdm/scep

ENTRYPOINT ["scepclient"]

但是,如果我使用docker build . --tag loadtest来构建它并尝试运行它,则会出现以下错误:

> docker run loadtest
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"scepclient\": executable file not found in $PATH": unknown.

我认为在基础映像(PATH)中添加到您的micromdm/scep的可执行文件也将在“派生”映像中可用,但事实并非如此,我不是。无法从https://docs.docker.com/engine/reference/builder/#from更好地理解这一点。

如何使用micromdm/scep图像,但运行scepclient而不是scepserver

1 个答案:

答案 0 :(得分:2)

根据dockerhub页面上的文档,您需要自己编译scep并自己构建docker映像。 https://hub.docker.com/r/micromdm/scep

通过拉取scep docker镜像后

docker pull micromdm/scep

您可以通过以下方式进行检查

docker history micromdm/scep
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    143554922979        17 months ago       /bin/sh -c #(nop)  CMD ["/scep"]                0B
    <missing>           17 months ago       /bin/sh -c #(nop)  VOLUME [/depot]              0B
    <missing>           17 months ago       /bin/sh -c #(nop)  EXPOSE 8080/tcp              0B
    <missing>           17 months ago       /bin/sh -c apk --no-cache add curl unzip && …   6.84MB
    <missing>           17 months ago       /bin/sh -c #(nop)  ENV SCEP_VERSION=v1.0.0      0B
    <missing>           21 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
    <missing>           21 months ago       /bin/sh -c #(nop) ADD file:df48d6d6df42a0138…   3.99MB

如您所见,没有一个层提到scep二进制文件的副本。但是它引用/中的scep二进制文件。但是/文件夹中没有客户端二进制文件。我建议您按照dockerhub(https://hub.docker.com/r/micromdm/scep)所述,检查关联的git存储库并构建scep和docker映像。

编译

要编译SCEP客户端和服务器,有一些要求。

您必须具有Go编译器。编译器通常在golang软件包中。 您必须为$ GOPATH设置一个shell变量。这是Go编译器和实用程序用于所有Go项目的目录。 设置完所有这些后,请使用go get github.com/micromdm/scep克隆存储库。 安装依赖项:make deps 编译服务器和客户端二进制文件:make build二进制文件将在build /文件夹中编译。

docker build

docker build -t working/scep:latest .

docker run

docker run -it --rm -v /path/to/ca/folder:/depot micromdm/scep:latest ca -init

基于该图像

接下来,您可以按照已经描述的那样更改入口点。但是这次,您将在FROM语句中使用新创建的工作/临时图像。

FROM working/scep

ENTRYPOINT ["scepclient"]