web-dev-qa-db-ja.com

.gitlab-ci.ymlでdocker-composeビルドを実行します

以下を含む.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

私は何を間違えていますか?

46
jonua

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を使用して独自の画像に簡単にアクセスできます。

10
n2o

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を開発しました。これは こちらにあります です。しかし、このようなコンテナを開始することはもうお勧めしません。

63
n2o

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
34
webmaster777

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
25
tmaier

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
9
Andreas Weber

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
0
m0etaz