使用通过Docker安装的Jenkins运行AWS命令行接口:找不到命令



从Jenkins管道运行aws时,我收到以下错误消息:command not found-which aws返回command not found

另一方面,当从单个作业运行aws时,它起作用——which aws返回/usr/local/bin/aws

你知道为什么会发生这种事吗?

谢谢。

您仍然需要在docker容器中安装AWS CLI。

# Swap to root user to install pip and aws cli then go back to jenkins user
USER root
RUN apt-get update
RUN apt install python3-pip -y
RUN pip3 install awscli --upgrade
USER jenkins

在我的案例中,问题只是我在docker容器中运行Jenkins,而我的AWS-CLI安装在主机上。暂时的解决方法是我通过";docker exec";并在该容器中安装了AWS-CLI。如果我的容器重新启动,我可能不得不再次安装AWS-CLI。更好的方法是创建一个docker映像,其中包含Jenkins旁边的AWS-CLI,或者使用AWS-CLI Jenkins代理来运行这些步骤/作业。

解决方案1:使用Dockerfile在Jenkins容器中安装aws-cli,并使用已存储在主机上的凭据。

工作示例:

Dockerfile:

FROM jenkins/jenkins:lts
USER root
# Set timezone
ENV TZ="UTC"
RUN apt-get -y update --fix-missing
# Install useful tools
RUN apt-get -y install nano wget ntp  git curl  libcurl4 libcurl4-openssl-dev zip unzip jq
# Install AWS Cli:
#   https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install

docker-compose.yml:

Version: '3.3'
services:
jenkins:
container_name: jenkins
build:
context: ./
dockerfile: Dockerfile
hostname: jenkinslocal
user: root
ports:
- 8500:8080
volumes: 
# local persistent storage for docker to keep plugins, jobs, workspaces, etc  
- ./jenkins-data:/var/jenkins_home
# mount the source file for project for easy access in pipeline
# and in project pipeline -> configure SCM -> GIT url can be: 
#      file:///projects/project1
- /Users/bogdan/docker/project1:/projects/project1
# make docker available in container
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
#provide AWS CLI credentials from host
- /Users/bogdan/.aws:/root/.aws

解决方案2:使用docker映像和aws-cli,aws-cli由具有主机凭据的aws提供。在这种情况下,如果您没有其他工具要安装,则不需要Dockerfile,只需要docker-compose.yml文件

工作示例:

Version: '3.3'
services:
jenkins:
container_name: jenkins
# image from docker hub
image: jenkins/jenkins:lts 
hostname: jenkinslocal
user: root
ports:
- 8500:8080
volumes: 
# local persistent storage for docker to keep plugins, jobs, workspaces, etc  
- ./jenkins-data:/var/jenkins_home
# mount the source file for project for easy access in pipeline
# and in project pipeline -> configure SCM -> GIT url can be: 
#      file:///projects/project1
- /Users/bogdan/docker/project1:/projects/project1
# make docker available in container
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker

文档可在此处找到:https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html

Jenkins启动并运行后,您可以登录Jenkins容器:

docker exec -it jenkins bash

并像这样运行AWS-CLI:

docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli --version

在Jenkins管道中使用此命令将很困难,并且脚本不会在真正的生产服务器上运行,因此您需要创建一个别名来使用命令";aws":

alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v amazon/aws-cli'

现在你可以测试:

aws --version

为了避免登录Jenkins容器,您可以将命令添加到docker-compose.yml文件:

command: sh -c "alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v amazon/aws-cli'" 

重要!

解决方案2在某些情况下可能很难使用,因为默认情况下,bash脚本中不提供别名。

最新更新