首页 > 解决方案 > 在 docker 的 Gitlab 管道中出现错误“jq:找不到命令”

问题描述

我正在构建 Docker 映像并使用 Gitlab 管道将其部署到 AWS ECS 服务,但尽管已成功安装 jq 包,但仍收到错误为“ jq: command not found ”(参考图片)

错误图像

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}" 

标签: dockergitlabgitlab-ci-runner

解决方案


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

此命令未在您安装 jq 的 docker 容器内运行。

我自己没有使用过 gitlab 管道,我不能 100%,但我会 90%,其中一个可以解决您的问题:

  1. 在已经运行的容器中本地安装包:

    • apk update && apk add curl jq python3 py3-pip
  1. 不要使用--rm

  2. 将安装jq从容器更改docker:gitdocker: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在主机内的容器内。


推荐阅读