web-dev-qa-db-fra.com

Exécutez docker-compose dans le fichier .gitlab-ci.yml

J'ai un .gitlab-ci.yml fichier contenant les éléments suivants:

image: docker:latest

services:
  - docker:dind

before_script:
  - docker info
  - docker-compose --version

buildJob:
  stage: build
  tags:
    - docker
  script:
    - docker-compose build

Mais en ci-log Je reçois un message:

$ docker-compose --version
/bin/sh: eval: line 46: docker-compose: not found

Qu'est-ce que je fais mal?

46
jonua

EDIT J'ai ajouté une autre réponse fournissant un exemple minimal pour une configuration .gitlab-ci.yml prenant en charge docker-compose.


docker-compose peut être installé en tant que package Python, qui n’est pas fourni avec votre image. L’image que vous avez choisie ne fournit même pas une installation de Python:

$ docker run --rm -it docker sh
/ # find / -iname "python"
/ # 

Looking for Python donne un résultat vide. Vous devez donc choisir une image différente, qui correspond à vos besoins et qui, idéalement, est installée avec docker-compose ou vous en créez manuellement une.

L'image de menu fixe que vous avez choisie utilise Alpine Linux. Vous pouvez l'utiliser comme base pour votre propre image ou en essayer une autre si vous n'êtes pas familiarisé avec Alpine Linux.

J'ai eu le même problème et j'ai créé un fichier Dockerfile dans un référentiel GitHub public et je l'ai connecté à mon compte Docker Hub et choisi une construction automatisée pour créer mon image sur chaque référentiel Push to GitHub. Vous pourrez ensuite accéder facilement à vos propres images avec GitLab CI.

10
n2o

docker-compose a maintenant besoin de plus de prog-packages, décrits dans leur documentation officielle . Ceci est la solution conseillée, mais ne me satisfait pas vraiment ... Trop de paquets pour la rendre opérationnelle:

# .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

Je pense qu’il est maintenant temps de s’appuyer sur une image tierce ou je configurerais personnellement une génération nocturne pour effectuer les étapes ci-dessus et créer automatiquement une image de composition-menu fixe dans notre CI pour notre registre.

Personnellement, nous ne suivons plus ce flux, parce que vous perdez le contrôle sur les conteneurs en cours d'exécution et qu'ils risquent de s'exécuter sans fin. Cela est dû à l'exécuteur de docker-in-docker. Nous avons développé un script python comme solution de contournement pour tuer tous les anciens conteneurs de notre CI, qui peut être trouvé ici . Mais je ne suggère plus de démarrer des conteneurs comme celui-ci.

63
n2o

Docker compose également une image officielle : docker/compose

C'est la solution idéale si vous ne voulez pas l'installer à chaque pipeline.

Il n'a actuellement pas de balise latest, vous devrez donc le mettre à jour manuellement.

Puisque l'image utilise docker-compose comme point d’entrée, vous devez remplacer le point d’entrée pour revenir à /bin/sh -c dans votre .gitlab-ci.yml. Sinon, votre pipeline échouera avec 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

J'ai créé un conteneur docker simple sur lequel docker-compose Est installé sur docker:latest. Voir https://hub.docker.com/r/tmaier/docker-compose/

Votre fichier .gitlab-ci.yml Ressemblerait à ceci:

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

Si vous ne souhaitez pas fournir une image de menu fixe personnalisée avec docker-composition préinstallée, vous pouvez la faire fonctionner en installant Python pendant la construction. Avec Python installé, vous pouvez enfin installer docker-compose prêt à faire tourner vos conteneurs.

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/

Utilisez docker-compose exec avec - T si vous recevez ceci ou une erreur similaire:

$ 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 a maintenant un paquet docker-compose dans sa branche "Edge", vous pouvez donc l'installer de cette façon dans le fichier .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