エラー内容
Gitlab-CIにて、unit-testステージのDockerImageで指定したENTRYPOINTのスクリプトで、一番最後の
# entrypoint.sh
(中略)
exec "$@"
execの部分で以下のエラーが出る。
error: exec: "sh -c if [ -x /usr/local/bin/bash ]; then\n\texec /usr/local/bin/bash \nelif [ -x /usr/bin/bash ]; then\n\texec /usr/bin/bash \nelif [ -x /bin/bash ]; then\n\texec /bin/bash \nelif [ -x /usr/local/bin/sh ]; then\n\texec /usr/local/bin/sh \nelif [ -x /usr/bin/sh ]; then\n\texec /usr/bin/sh \nelif [ -x /bin/sh ]; then\n\texec /bin/sh \nelif [ -x /busybox/sh ]; then\n\texec /busybox/sh \nelse\n\techo shell not found\n\texit 1\nfi\n\n": stat sh -c if [ -x /usr/local/bin/bash ]; then
gitlab-ci.yml
# .gitlab-ci.yml
(中略)
unit-test:
image: gitlab.com:4567/my-docker-image:latest
stage: unit-test
script:
- ./unittest.sh
artifacts:
paths:
- ./_coverage
(中略)
my-docker-imageのDockerfile
# Dockerfile
(中略)
ENTRYPOINT ["/entrypoint.sh"]
CMD ["./manage.py", "runserver", "0.0.0.0:8000"]
解消
.gitlab-ci.yml
の image
でentrypoint
を空でオーバーライドする。
# .gitlab-ci.yml
unit-test:
image:
name: gitlab.com:4567/my-docker-image:latest
entrypoint: [""] # <-- 空を指定してオーバーライドする。
stage: unit-test
script:
- ./unittest.sh
artifacts:
paths:
- ./_coverage
(中略)
公式ドキュメントのここに書いてあった
https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#override-the-entrypoint-of-an-image
The runner expects that the image has no entrypoint or that the entrypoint is prepared to start a shell command.
RunnerはイメージにENTRYPOINTがないこと、またはシェルコマンドが開始できる準備ができていることを期待している(直訳)らしい。