Docker入口点“未找到”

时间:2018-03-12 12:15:44

标签: docker gitlab-ci

TL; DR
当我使用$ docker build -t broker .在本地构建Docker镜像时,为什么我的Docker镜像可以工作,但是当它在GitLab CI中构建时,我得到bash: line 1: /bin/broker: not found

背景/疑难解答
我正在使用GitLab CI使用Helm for Kubernetes部署我的系统的新版本。

我刚刚将Dockerfiles改为使用alpine:3.7而不是golang:1.9.2,因为它只是运行构建的二进制文件而不执行go代码,将我的图像大小从大约800MB降低到大约24MB左右。 / p>

我遇到的问题是,当图像是在GitLab CI中构建的时,我从容器中收到以下错误:

bash: line 1: /bin/broker: not found

我已经尝试changing ENTRYPOINT to CMD来确保二进制文件以shell身份运行,但它只是将错误更改为:

/bin/sh: /bin/broker: not found

如果我在本地构建图像并运行它,一切都按预期工作。此外,从GitLab CI日志中,我得到了这个:

$ go build
$ mv $SERVICE_NAME $CI_PROJECT_DIR
Uploading artifacts...
broker: found 1 matching files                        
Uploading artifacts to coordinator... ok            id=1234 
responseStatus=201 Created token=ABC123

这意味着我的二进制文件已成功构建,就像旧图像一样。接下来,我明白了:

[...]
Step 3/4 : COPY ./broker /bin
 ---> 50d04cbbc81c
Step 4/4 : CMD /bin/broker
 ---> Running in c48a73351599
[...]

...意味着二进制文件已成功下载为工件并复制到图像上。

我的Dockerfile如下所示:

# This file is intended for use with the GitLab CI tool where the binary has already been built.
FROM alpine:3.7

# Make sure we have some basic dev tools.
RUN \
    apk --update add curl bash nano && \
    rm -r /var/cache/apk/*

# The binary is built and downloaded to the current directory by GitLab CI.
COPY ./broker /bin
RUN chmod +x /bin/broker

# Run the program.
CMD /bin/broker

我使用完全限定的路径,因此$PATH var无关紧要。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在说出更好的Google搜索后,我找到了解决方案。

当运行go build时,我当然是为不在Alpine上运行的本地Linux构建的。

解决方法是将我的GitLab CI文件中的go build更改为CC=$(which musl-gcc) go build --ldflags '-w -linkmode external -extldflags "-static"',该版本适用于Alpine。

musl-gcc is included in the musl-tools,要安装它,请运行apt-get -y musl-tools