Получение ошибки «jq: команда не найдена» в конвейере Gitlab для докера

Я создаю образы Docker и развертываю их в сервисе AWS ECS с помощью конвейера Gitlab, но получаю сообщение об ошибке «jq: команда не найдена», несмотря на то, что пакет jq успешно установлен (см. изображения)

Изображение ошибки

статус шага установки пакета jq

Файл .gitlab-ci.yml для справки.

image: docker:latest
variables:
  DOCKER_DRIVER: overlay2

services:
  - docker:dind

stages:
  - build_dev
  - deploy_dev

before_script:
  - docker run --rm docker:git apk update
  - docker run --rm docker:git apk upgrade
  - docker run --rm docker:git apk add --no-cache curl jq
  - docker run --rm docker:git apk add python3 py3-pip
  - pip3 install awscli
  - aws configure set aws_access_key_id $AWS_ACCESS_KEY
  - aws configure set aws_secret_access_key $AWS_SECRET_KEY
  - aws configure set region $AWS_DEFAULT_REGION
  - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_LOGIN_URI

build_dev:
  stage: build_dev
  only:
  - dev
  script:  
    - docker build -t research-report-phpfpm .
    - docker tag research-report-phpfpm:latest $REPOSITORY_URI_LARAVEL:latest
    - docker push $REPOSITORY_URI_LARAVEL:latest

    - docker build -t research-report-nginx -f Dockerfile_Nginx .
    - docker tag research-report-nginx:latest $REPOSITORY_URI_NGINX:latest
    - docker push $REPOSITORY_URI_NGINX:latest

deploy_dev:
  stage: deploy_dev
  script:    

    - echo $REPOSITORY_URI_LARAVEL:$IMAGE_TAG
    - TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition "$TASK_DEFINITION_NAME" --region "${AWS_DEFAULT_REGION}")
    - NEW_CONTAINER_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$REPOSITORY_URI_LARAVEL:$IMAGE_TAG" '.taskDefinition.containerDefinitions[0].image = $IMAGE | .taskDefinition.containerDefinitions[0]')
    - echo "Registering new container definition..."
    - aws ecs register-task-definition --region "${AWS_DEFAULT_REGION}" --family "${TASK_DEFINITION_NAME}" --container-definitions "${NEW_CONTAINER_DEFINTIION}"    
    - echo "Updating the service..."
    - aws ecs update-service --region "${AWS_DEFAULT_REGION}" --cluster "${CLUSTER_NAME}" --service "${SERVICE_NAME}"  --task-definition "${TASK_DEFINITION_NAME}" 

Я не понимаю. Из того, что я вижу, вы устанавливаете curl и jq в отдельный контейнер, который они удаляют из-за --rm - зачем вы это делаете? Если вам нужноjq в контейнере, вам нужно установить его в этот контейнер. Если вам это нужно на этапе развертывания, я думаю, вы можете просто установить его вместе с awscli?

kkubina 10.12.2020 17:36
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
1
7 848
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

NEW_CONTAINER_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$REPOSITORY_URI_LARAVEL:$IMAGE_TAG" '.taskDefinition.containerDefinitions[0].image = $IMAGE | .taskDefinition.containerDefinitions[0]')

Эта команда не выполняется внутри контейнера докеров, в котором вы устанавливаете jq.

  • Ваша конфигурация gitlab ci/cd работает в контейнере с тегом docker:latest.
  • Вы сделали образ докера docker:dind доступным во время выполнения в виде контейнера (, предположительно, чтобы не запускать dockerd вручную ).
  • Затем вы запускаете команды в контейнере с именем docker:git, который отделен от контекста этой сборки.
  • Вы также запускаете эти команды с помощью --rm, , что гарантирует, что добавление apk, которое вы запускаете, будет потеряно после оператора .

Я сам не использовал конвейеры gitlab, я не могу быть на 100%, но я бы был на 90% уверен, что один из них может решить вашу проблему:

  1. Установите пакеты локально в уже работающий контейнер:

    • apk update && apk add curl jq python3 py3-pip
  1. Не используйте --rm

  2. Измените установку jq с контейнера docker:git на docker:latest

    • docker run docker:latest apk update
    • docker run docker:latest apk add curl jq python3 py3-pip

Учитывая, что команда:

- NEW_CONTAINER_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$REPOSITORY_URI_LARAVEL:$IMAGE_TAG" '.taskDefinition.containerDefinitions[0].image = $IMAGE | .taskDefinition.containerDefinitions[0]')

На самом деле работает в контексте конвейера (предположительно внутри docker:latest), моя ставка на 1 — вы запускаете jq на «хосте», но устанавливаете jq внутри контейнера внутри хоста.

Другие вопросы по теме