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