2017-08-30 5 views
0

Je tente de déployer un conteneur Docker dans EC2 Container Services avec des pipelines GitLab. J'ai déjà créé le cluster dans AWS et 2 instances sont également en cours d'exécution. Le problème est qu'une fois la commandeErreur lors du déploiement d'un conteneur Docker dans EC2 Container Services via GitLab Pipeline

ecs-cli compose --file ./Documents/Development/workillence/docker-compose-test.yml service up 
--container-name testContainer --container-port 8080 #--role arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole 
--target-group-arn arn:aws:elasticloadbalancing:us-east-2:084622260700:targetgroup/TestTG/af0fbec5b9cc869f 

est exécuté, je reçois l'erreur suivante:

WARN[0000] Skipping unsupported YAML option for service... option name=build service name=testContainer 
ERRO[0001] Error registering task definition    error="ClientException: Container.image should not be null or empty.\n\tstatus code: 400, request id: 27277917-8d8e-11e7-8cb2-8d5ad96f4568" family=ecscompose-workillence 
ERRO[0001] Create task definition failed     error="ClientException: Container.image should not be null or empty.\n\tstatus code: 400, request id: 27277917-8d8e-11e7-8cb2-8d5ad96f4568" 
FATA[0001] ClientException: Container.image should not be null or empty. 

Ceci est une capture d'écran de mon repo AWS:

enter image description here

L'image ne ne semble pas être vide.

Voici comment mon fichier CI ressemble à:

image: docker:latest 
services: 
    - docker:dind 
stages: 
    - build 
    - deploy 

testBuild: 
    stage: build 
    script: 
    - docker version 
    - docker build -t 084622260700.dkr.ecr.us-east-2.amazonaws.com/testrepo:latest app/ 
    - docker images 
    - docker login -u AWS -p <password> 084622260700.dkr.ecr.us-east-2.amazonaws.com 
    - docker push 084622260700.dkr.ecr.us-east-2.amazonaws.com/testrepo:latest 

testDeploy: 
    stage: deploy 
    image: python:3-alpine 
    variables: 
    AWS_REGION: "us-east-2" 
    AWS_ACCESS_KEY_ID: "key" 
    AWS_SECRET_ACCESS_KEY: "key" 
    PROD_TARGET_GROUP_ARN: "arn:aws:elasticloadbalancing:us-east-2:084622260700:targetgroup/TestTG/af0fbec5b9cc869f" 
    ECS_CLUSTER: "testCluster" 
    AWS_KEY_PAIR: "testKP.pem" 
    AWS_VPC: "vpc-0419416d" 
    AWS_SUBNETS: "subnet-ad6cdfe0,subnet-ad6cdfe0,subnet-0fc1aa74" 
    AWS_INSTANCE_TYPE: "t2.micro" 
    AWS_INSTANCE_COUNT: "2" #Number of instances to scale to 
    AWS_ROLE: "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole" 
    before_script: 
##### Install AWS ECS-CLI ##### 
    - apk add --update curl 
    - curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-latest 
    - chmod +x /usr/local/bin/ecs-cli 
    script: 
##### Configure ECS-CLI, run the container and scale to 2 instances ##### 
    - ecs-cli configure --region $AWS_REGION --access-key $AWS_ACCESS_KEY_ID --secret-key $AWS_SECRET_ACCESS_KEY --cluster $ECS_CLUSTER 
    - ecs-cli up --keypair $AWS_KEY_PAIR --capability-iam -c $ECS_CLUSTER --instance-type t2.micro --size 2 --vpc $AWS_VPC --subnets $AWS_SUBNETS --force 
##### This docker-compose.yml is the one described above ##### 
    - ecs-cli compose --file docker-compose.yml service up --target-group-arn $PROD_TARGET_GROUP_ARN --container-name app --container-port 8080 --role $AWS_ROLE 
    - ecs-cli compose --file docker-compose.yml service scale 2 
    environment: 
    name: ci 
##### This is the URL seen under 'DNS name' when the LB was created ##### 
    url: TestLB-1717492587.us-east-2.elb.amazonaws.com 
    only: 
    - aws 

Et voici comment le fichier de composition ressemble à:

app: 
    image: 084622260700.dkr.ecr.us-east-2.amazonaws.com/testrepo:latest 
    command: yarn run start-dev 
    links: 
     - mongodb 
     - redis 
     - elasticsearch 
    ports: 
     - '8000:8000' 
     - '5858:5858' 
     - '9229:9229' 
     - '80:8080' 
    environment: 
     NODE_ENV: local 
    volumes: 
     - ./testrepo/.:/opt/app 
    mongodb: 
    build: docker/definitions/mongo 
    ports: 
     - "27017:27017" 
    redis: 
    build: docker/definitions/redis 
    ports: 
     - "6379:6379" 
    elasticsearch: 
    build: docker/definitions/elasticsearch 
    ports: 
     - "9200:9200" 
     - "9300:9300" 

Avez-vous déjà fait face à la question identique ou similaire et probablement comment avez tu le résous?

Répondre

1

Le problème est clair. Votre fichier Compose est pour construire et ne pas l'image

WARN[0000] Skipping unsupported YAML option for service... option name=build service name=testContainer 
ERRO[0001] Error registering task definition    error="ClientException: Container.image should not be null or empty.\n\tstatus code: 400, request id: 27277917-8d8e-11e7-8cb2-8d5ad96f4568" family=ecscompose-workillence 
ERRO[0001] Create task definition failed     error="ClientException: Container.image should not be null or empty.\n\tstatus code: 400, request id: 27277917-8d8e-11e7-8cb2-8d5ad96f4568" 
FATA[0001] ClientException: Container.image should not be null or empty. 

Alors, que vous avez besoin est

mongodb: 
    build: docker/definitions/mongo 
    image: <image from aws or docker hub> 
    ports: 
     - "27017:27017" 
    redis: 
    build: docker/definitions/redis 
    image: <image from aws or docker hub> 
    ports: 
     - "6379:6379" 
    elasticsearch: 
    build: docker/definitions/elasticsearch 
    image: <image from aws or docker hub> 
    ports: 
     - "9200:9200" 
     - "9300:9300" 

Une fois que vous ajoutez que cela devrait fonctionner. Si la valeur build crée un problème, vous pouvez utiliser deux fichiers de composition distincts. Un avec des valeurs de construction et un avec des valeurs d'image

+0

Je ne devinais pas que ces services joueront un rôle dans cette erreur et je ne l'ai pas décrit mais j'utiliserai des fournisseurs externes pour mongo, redis et elasticsearch. Cela signifie qu'ils ne seront pas construits dans le paquet Docker, en plus j'ai déjà testé l'environnement localement et cela fonctionne, je suis capable de connecter les trois d'entre eux. Est-il possible de les déclarer comme externes dans le fichier de composition? –

+0

Si elles sont externes, supprimez-les de composer. Gardez deux composer '-test.yml' et' -prod.yml'. Utilisez 'prod' pour le déploiement AWS –

+0

Ok, je l'ai testé et encore et encore la même erreur. Je utilisé le code suivant: 'testContainer: build: 084622260700.dkr.ecr.us-east-2.amazonaws.com/testrepo:latest commande: run fil start-dev ports: - « 8000 : 8000' - '5858: 5858' - '9229: 9229' - '80: 8080' environnement: NODE_ENV: locaux volumes: - ./testrepo /.:/ opt/app' –