J'essaie de configurer des tests automatisés Rails sur AWS CodeBuild en utilisant docker-compose, mais cela génère des erreurs.
Dans buildspec.yml:
phases:
build:
commands:
- docker-compose up -d
[Container] 2018/10/23 11:27:56 Running command docker-compose up -d
Couldn't connect to Docker daemon at http+docker://localhost - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_Host environment variable.
[Container] 2018/10/23 11:27:56 Command did not exit successfully docker-compose up -d exit status 1
[Container] 2018/10/23 11:27:56 Running command echo This always runs even if the install command fails
This always runs even if the install command fails
[Container] 2018/10/23 11:27:56 Phase complete: BUILD Success: false
[Container] 2018/10/23 11:27:56 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: docker-compose up -d. Reason: exit status 1
Vraisemblablement, j'ai besoin d'installer Docker et de démarrer le service, mais cela exécuterait Docker dans Docker et nécessiterait que le serveur de build soit démarré avec une autorisation privilégiée. Seuls les exemples que je peux voir concernent la création d'images Docker, mais j'essaie simplement de l'utiliser pour configurer l'environnement dans lequel exécuter le test.
Merci à @mferre d'avoir répondu à cette question. Docker-compose est en effet complètement pris en charge sans rien faire de spécial. La clé est de choisir une image Docker dans la section "environnement" lors de la configuration dans la console AWS CodeBuild (ou la même via l'API):
Ou peut également être spécifié pour un projet existant - dans Build/Build Projects, sélectionnez le projet et Environnements dans le menu Edition. Cela vous permet de spécifier l'image:
Vous pouvez utiliser n'importe quelle autre image et script de la configuration Docker dans buildspec.yml
, mais le plus simple est d'utiliser l'image Docker officielle comme ci-dessus. Avec ceci comme conteneur, docker et docker-compose sont pré-installés, donc docker-compose "fonctionne". Si le projet a un docker-compose.yml
fichier à sa racine, le buildspec.yml
peut être aussi simple que de l'exécuter immédiatement:
version: 0.2
phases:
build:
commands:
- docker-compose up -d
Utilisez-vous le runtime Docker pour votre environnement de génération?
Je travaille avec ce dépôt: https://github.com/mreferre/yelb
Ce dockercompose ne construit rien (il est plutôt destiné à être déployé) mais je pense que vous rencontrez un problème bien avant cela. Votre composition devrait fonctionner si vous utilisez le runtime Docker.
Voici à quoi ressemble ma buildspec:
version: 0.2
phases:
build:
commands:
- cd deployments/platformdeployment/Docker
- docker-compose up -d
Et voici la sortie:
[Container] 2019/02/20 13:48:02 Waiting for agent ping
[Container] 2019/02/20 13:48:04 Waiting for DOWNLOAD_SOURCE
[Container] 2019/02/20 13:48:07 Phase is DOWNLOAD_SOURCE
[Container] 2019/02/20 13:48:07 CODEBUILD_SRC_DIR=/codebuild/output/src292484508/src/github.com/mreferre/yelb
[Container] 2019/02/20 13:48:07 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2019/02/20 13:48:07 Processing environment variables
[Container] 2019/02/20 13:48:07 Moving to directory /codebuild/output/src292484508/src/github.com/mreferre/yelb
[Container] 2019/02/20 13:48:07 Registering with agent
[Container] 2019/02/20 13:48:07 Phases found in YAML: 1
[Container] 2019/02/20 13:48:07 BUILD: 2 commands
[Container] 2019/02/20 13:48:07 Phase complete: DOWNLOAD_SOURCE Success: true
[Container] 2019/02/20 13:48:07 Phase context status code: Message:
[Container] 2019/02/20 13:48:07 Entering phase INSTALL
[Container] 2019/02/20 13:48:07 Phase complete: INSTALL Success: true
[Container] 2019/02/20 13:48:07 Phase context status code: Message:
[Container] 2019/02/20 13:48:08 Entering phase PRE_BUILD
[Container] 2019/02/20 13:48:08 Phase complete: PRE_BUILD Success: true
[Container] 2019/02/20 13:48:08 Phase context status code: Message:
[Container] 2019/02/20 13:48:08 Entering phase BUILD
[Container] 2019/02/20 13:48:08 Running command cd deployments/platformdeployment/Docker
[Container] 2019/02/20 13:48:08 Running command docker-compose up -d
Creating network "docker_yelb-network" with driver "bridge"
Pulling redis-server (redis:4.0.2)...
4.0.2: Pulling from library/redis
Pulling yelb-db (mreferre/yelb-db:0.3)...
0.3: Pulling from mreferre/yelb-db
Pulling yelb-appserver (mreferre/yelb-appserver:0.3)...
0.3: Pulling from mreferre/yelb-appserver
Pulling yelb-ui (mreferre/yelb-ui:0.3)...
0.3: Pulling from mreferre/yelb-ui
Creating docker_redis-server_1 ...
Creating docker_yelb-db_1 ...
·[2A·[2K
Creating docker_redis-server_1 ... ·[32mdone·[0m
·[2B·[1A·[2K
Creating docker_yelb-db_1 ... ·[32mdone·[0m
·[1BCreating docker_yelb-appserver_1 ...
·[1A·[2K
Creating docker_yelb-appserver_1 ... ·[32mdone·[0m
·[1BCreating docker_yelb-ui_1 ...
·[1A·[2K
Creating docker_yelb-ui_1 ... ·[32mdone·[0m
·[1B
[Container] 2019/02/20 13:49:00 Phase complete: BUILD Success: true
[Container] 2019/02/20 13:49:00 Phase context status code: Message:
[Container] 2019/02/20 13:49:00 Entering phase POST_BUILD
[Container] 2019/02/20 13:49:00 Phase complete: POST_BUILD Success: true
[Container] 2019/02/20 13:49:00 Phase context status code: Message:
D'accord, j'ai compris le problème!
Vous devez activer "Accès privilégié" sur le conteneur CodeBuild. Cela vous permettra d'interagir avec le docker cli.
Ajoutez ensuite ces deux lignes aux commandes d'installation:
- Nohup /usr/local/bin/dockerd --Host=unix:///var/run/docker.sock --Host=tcp://127.0.0.1:2375 --storage-driver=overlay2& - timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
`
ex:
version: 0.2
phases:
install:
commands:
- Nohup /usr/local/bin/dockerd --Host=unix:///var/run/docker.sock --Host=tcp://127.0.0.1:2375 --storage-driver=overlay2&
- timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
pre_build:
commands:
- docker build -t helloworld .
build:
commands:
- docker images
- docker run helloworld echo "Hello, World!"