Я создаю образы 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}"
NEW_CONTAINER_DEFINTIION=$(echo $TASK_DEFINITION | jq --arg IMAGE "$REPOSITORY_URI_LARAVEL:$IMAGE_TAG" '.taskDefinition.containerDefinitions[0].image = $IMAGE | .taskDefinition.containerDefinitions[0]')
Эта команда не выполняется внутри контейнера докеров, в котором вы устанавливаете jq.
docker:latest
.docker:dind
доступным во время выполнения в виде контейнера (, предположительно, чтобы не запускать dockerd вручную ).docker:git
, который отделен от контекста этой сборки.--rm
, , что гарантирует, что добавление apk, которое вы запускаете, будет потеряно после оператора .Я сам не использовал конвейеры gitlab, я не могу быть на 100%, но я бы был на 90% уверен, что один из них может решить вашу проблему:
Установите пакеты локально в уже работающий контейнер:
apk update && apk add curl jq python3 py3-pip
Не используйте --rm
Измените установку 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
внутри контейнера внутри хоста.
Я не понимаю. Из того, что я вижу, вы устанавливаете curl и jq в отдельный контейнер, который они удаляют из-за
--rm
- зачем вы это делаете? Если вам нужноjq
в контейнере, вам нужно установить его в этот контейнер. Если вам это нужно на этапе развертывания, я думаю, вы можете просто установить его вместе с awscli?