docker - 在 docker 的 Gitlab 管道中出现错误“jq:找不到命令”
问题描述
我正在构建 Docker 映像并使用 Gitlab 管道将其部署到 AWS ECS 服务,但尽管已成功安装 jq 包,但仍收到错误为“ jq: command not found ”(参考图片)
.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 容器内运行。
- 您的 gitlab ci/cd 配置在标记为
docker:latest
. - 您已将 docker 映像
docker:dind
在运行时作为容器提供(大概是为了避免手动启动 dockerd)。 - 然后,您将在一个名为 的容器上运行命令,该容器
docker:git
与此构建的上下文是分开的。 - 您还使用 运行这些命令
--rm
,这保证apk add
您正在运行的语句在语句之后丢失。
我自己没有使用过 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
在主机内的容器内。
推荐阅读
- java - 在 Spring 中使用多线程时出现 NullPointer 异常
- java - JAVA基本编码。为什么 100/1=110,就像 300/3 ,400/4, 500/5 一样?
- python-3.x - 如何防止 pynput 和 ctypes 发生冲突?
- c# - HttpClient 在 Angular 中提出问题
- python - 从匹配列的条目中打印标题
- .net - 格式名称前缀(mcdonald、o'brien 等)
- python - 如何根据列表中的值从文本文件中删除行?
- docker - KUBECONFIG 设置完成,但 kubectl get pods -o wide 无法从 gitlab 中的远程 docker runner 工作
- python - Python:如何在变量重复时增加计数
- amazon-web-services - AWS Batch EC2 预置时间