以下を含む.gitlab-ci.yml
ファイルがあります。
image: docker:latest
services:
- docker:dind
before_script:
- docker info
- docker-compose --version
buildJob:
stage: build
tags:
- docker
script:
- docker-compose build
しかし、ci-log
でメッセージを受け取ります:
$ docker-compose --version
/bin/sh: eval: line 46: docker-compose: not found
私は何を間違えていますか?
EDIT docker-composeをサポートする.gitlab-ci.yml構成の最小限の例を提供する別の回答を追加しました。
docker-compose
はPythonパッケージとしてインストールできますが、これはイメージには付属していません。選択したイメージは、Pythonのインストールも提供していません。
$ docker run --rm -it docker sh
/ # find / -iname "python"
/ #
Pythonを検索すると、空の結果が得られます。そのため、ニーズに合った、理想的にはdocker-composeがインストールされているか、手動で作成した別のイメージを選択する必要があります。
選択したdockerイメージは、Alpine Linuxを使用しています。 Alpine Linuxに慣れていない場合は、独自のイメージのベースとして使用するか、最初に別のイメージを試すことができます。
同じ問題が発生し、パブリックGitHubリポジトリにDockerfileを作成し、それをDocker Hubアカウントに接続し、GitHubリポジトリへの各プッシュでイメージをビルドする自動ビルドを選択しました。その後、GitLab CIを使用して独自の画像に簡単にアクセスできます。
docker-composeには、さらに多くの開発パッケージが必要になりました。これについては、 公式ドキュメント で説明されています。これは推奨される解決策ですが、実際に私を満足させるものではありません...それを起動して実行するにはパッケージが多すぎます:
# .gitlab-ci.yml
image: docker
services:
- docker:dind
build:
script:
- apk add --no-cache py-pip python-dev libffi-dev openssl-dev gcc libc-dev make
- pip install docker-compose
- docker-compose up -d
今はサードパーティのイメージに依存する時か、ナイトリービルドを構成して上記の手順を実行し、レジストリのCIにcompose-docker-imageを自動的にビルドすると思います。
実行中のコンテナに関する制御を失い、エンドレスで実行される可能性があるため、個人的にはこのフローには従いません。これは、docker-in-docker executorが原因です。 CIの古いコンテナをすべて削除するための回避策としてpython-scriptを開発しました。これは こちらにあります です。しかし、このようなコンテナを開始することはもうお勧めしません。
Docker composeにはofficialイメージもあります: docker/compose
すべてのパイプラインにインストールしたくない場合、これは理想的なソリューションです。
現在latest
タグがないため、手動で更新する必要があります。
イメージはdocker-compose
をエントリポイントとして使用するため、- エントリポイントをオーバーライドする/bin/sh -c
で.gitlab-ci.yml
に戻る必要があります。そうしないと、パイプラインはNo such command: sh
で失敗します
# Official docker compose image.
image:
name: docker/compose:1.22.0 # update tag to whatever version you want to use.
entrypoint: ["/bin/sh", "-c"]
services:
- docker:dind
before_script:
- docker version
- docker-compose version
build:
stage: build
script:
- docker-compose down
- docker-compose build
- docker-compose up tester-image
docker-compose
の上にdocker:latest
がインストールされた単純なdockerコンテナーを作成しました。 https://hub.docker.com/r/tmaier/docker-compose/ を参照してください
.gitlab-ci.yml
ファイルは次のようになります。
image: tmaier/docker-compose:latest
services:
- docker:dind
before_script:
- docker info
- docker-compose --version
buildJob:
stage: build
tags:
- docker
script:
- docker-compose build
Docker-composeが事前にインストールされたカスタムdockerイメージを提供したくない場合は、ビルド時にPythonをインストールすることで動作させることができます。 Pythonをインストールすると、最終的にdocker-composeをインストールして、コンテナーをスピンアップできるようになります。
image: docker:latest
services:
- docker:dind
before_script:
- apk add --update python py-pip python-dev && pip install docker-compose # install docker-compose
- docker version
- docker-compose version
test:
cache:
paths:
- vendor/
script:
- docker-compose up -d
- docker-compose exec -T php-fpm composer install --prefer-dist
- docker-compose exec -T php-fpm vendor/bin/phpunit --coverage-text --colors=never --whitelist src/ tests/
これまたは同様のエラーが表示された場合は、docker-compose execと-Tを使用します。
$ docker-compose exec php-fpm composer install --prefer-dist
Traceback (most recent call last):
File "/usr/bin/docker-compose", line 9, in <module>
load_entry_point('docker-compose==1.8.1', 'console_scripts', 'docker-compose')()
File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 62, in main
command()
File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 114, in perform_command
handler(command, command_options)
File "/usr/lib/python2.7/site-packages/compose/cli/main.py", line 442, in exec_command
pty.start()
File "/usr/lib/python2.7/site-packages/dockerpty/pty.py", line 338, in start
io.set_blocking(pump, flag)
File "/usr/lib/python2.7/site-packages/dockerpty/io.py", line 32, in set_blocking
old_flag = fcntl.fcntl(fd, fcntl.F_GETFL)
ValueError: file descriptor cannot be a negative integer (-1)
ERROR: Build failed: exit code 1
Alpine Linuxの「Edge」ブランチにdocker-composeパッケージが追加されました。この方法で.gitlab-ci.ymlにインストールできます
a-job-with-docker-compose:
image: docker
services:
- docker:dind
script:
- apk add docker-compose --update-cache --repository http://dl-3.alpinelinux.org/Alpine/Edge/testing/ --allow-untrusted
- docker-compose -v