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无关紧要。
感谢您的帮助。
答案 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
。