80 votes

Exécuter la construction de docker-compose dans .gitlab-ci.yml

J'ai un .gitlab-ci.yml qui contient 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 de mal ?

89voto

n2o Points 441

Suite à la documentation officielle :

# .gitlab-ci.yml
image: docker
services:
  - docker:dind    
build:
  script:
    - apk add --no-cache docker-compose
    - docker-compose up -d

Exemple de docker-compose.yml :

version: "3.7"
services:
  foo:
    image: alpine
    command: sleep 3
  bar:
    image: alpine
    command: sleep 3

Personnellement, nous ne suivons plus ce flux, car vous perdez le contrôle sur les conteneurs en cours d'exécution et ils peuvent finir par tourner sans fin. Ceci est dû à l'exécuteur docker-in-docker. Nous avons développé un script python-script comme solution de rechange pour tuer tous les anciens conteneurs dans notre CI, qui peuvent être trouvés ici . Mais je ne suggère plus de commencer des conteneurs comme ça.

0 votes

@tmaier Je pense que je suis coincé ici aussi. Quel type de "Runner-Installation" avez-vous utilisé ? Je veux dire, lequel des trois moyens avez-vous utilisé ? docs.gitlab.com/ee/ci/docker/

0 votes

Nous utilisons l'exécuteur docker-in-docker. docs.gitlab.com/ee/ci/docker/

2 votes

Bien que cela fonctionne, cela signifie que sur chaque build docker-compose doit être installé (et récupéré...) et donc il augmentera le temps de construction. Si vous avez plusieurs tâches nécessitant docker-compose (et dans un scénario de production, vous le ferez probablement), le temps de construction augmentera considérablement.

83voto

webmaster777 Points 331

Docker fournit également un officiel image : docker/compose

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

Notez que dans la dernière version de GitLab CI/Docker, vous devrez probablement donner un accès privilégié à votre GitLab CI Runner et configurer/désactiver TLS. Voir Utiliser le workflow docker-in-docker avec l'exécuteur Docker

variables:
  DOCKER_HOST: tcp://docker:2375/
  DOCKER_DRIVER: overlay2

# Official docker compose image.
image:
  name: docker/compose:latest

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

Notez que dans les versions de docker-compose plus tôt que 1,25 :

Puisque l'image utilise docker-compose-entrypoint.sh comme point d'entrée, vous devrez contourner il retour à /bin/sh -c dans votre .gitlab-ci.yml . Sinon, votre pipeline échouera avec No such command: sh

    image:
      name: docker/compose:latest
      entrypoint: ["/bin/sh", "-c"]

0 votes

Cela fonctionne, mais comme le dit la source que vous avez citée, il faut un GitLab *9.4**+ , parce que vous avez **besoin de pour écraser le point d'entrée dans le CI yaml.

5 votes

@webmaster777 J'obtiens cette erreur lorsque l'exécution atteint "docker-compose version"... Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? ERROR: Job failed: exit code 1 ... comment puis-je le résoudre ?

5 votes

Cela n'a fonctionné que lorsque j'ai ajouté les variables DOCKER_HOST: tcp://docker:2375/ y DOCKER_DRIVER: overlay2

31voto

tmaier Points 720

J'ai créé un simple conteneur docker qui a docker-compose installé sur le dessus de docker:latest . Voir https://hub.docker.com/r/tmaier/docker-compose/

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

0 votes

J'obtiens cette erreur dans le fichier gitlab ci error: command 'gcc' failed with exit status 1

16voto

n2o Points 441

EDITAR J'ai ajouté une autre réponse fournissant un exemple minimal pour une configuration .gitlab-ci.yml supportant docker-compose.


docker-compose peut être installé comme un paquetage Python, qui n'est pas livré 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"
/ # 

La recherche de Python donne un résultat vide. Vous devez donc choisir une image différente, qui correspond à vos besoins et qui a idéalement docker-compose installé ou vous pouvez en créer un.

L'image docker que vous avez choisie utilise Alpine Linux. Vous pouvez l'utiliser comme base pour votre propre image ou en essayer une autre d'abord si vous n'êtes pas familier avec Alpine Linux.

J'ai eu le même problème et j'ai créé un Dockerfile dans un dépôt public GitHub et je l'ai connecté avec mon compte Docker Hub et j'ai choisi une construction automatique pour construire mon image à chaque poussée vers le dépôt GitHub. Vous pouvez ensuite accéder facilement à vos propres images avec le GitLab CI.

5 votes

Pouvez-vous supprimer une de vos réponses ? C'est déroutant d'en trouver deux, plus beaucoup de messages "EDIT". (Nous pouvons voir l'historique des modifications si nous en avons besoin).

9voto

Andreas Weber Points 91

Si vous ne souhaitez pas fournir une image docker personnalisée avec docker-compose préinstallé, vous pouvez le faire fonctionner en installant Python lors de la construction. Une fois 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 con -T si vous recevez cette erreur 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

0 votes

Ce n'est pas une méthode courante, en fait vous pouvez obtenir "apk : command not found".

0 votes

Cela ne fonctionne plus, peut-être à cause des nouvelles images docker. maintenant python y python-dev ne sont plus des ajouts de paquets apk valides, et ensuite lorsque vous spécifiez python2, gcc est manquant en quelque sorte

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X