Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在Jenkins中作为ssh脚本的一部分运行docker rmi$(docker images-a-q)_Linux_Bash_Docker_Jenkins_Jenkins Cli - Fatal编程技术网

Linux 如何在Jenkins中作为ssh脚本的一部分运行docker rmi$(docker images-a-q)

Linux 如何在Jenkins中作为ssh脚本的一部分运行docker rmi$(docker images-a-q),linux,bash,docker,jenkins,jenkins-cli,Linux,Bash,Docker,Jenkins,Jenkins Cli,我正在构建一个Jenkins作业,以在AWS EC2实例上构建docker容器,这是一个Jenkins脚本示例,该脚本给出了错误: #!/bin/bash -e # Not giving the IP here but I guess you can understand HOST = Some IP address of EC2 instance in AWS # Current Project workspace # Download source code and create a

我正在构建一个Jenkins作业,以在AWS EC2实例上构建docker容器,这是一个Jenkins脚本示例,该脚本给出了错误:

#!/bin/bash -e
# Not giving the IP here but I guess you can understand
HOST = Some IP address of EC2 instance in AWS 

# Current Project workspace 
# Download source code and create a tar and then SCP it in to AWS EC2
# So my Code is copied in to AWS EC2 instance now ...
# Now do the SSH and run the script on AWS EC2 instance
ssh -o StrictHostKeyChecking=no -i MySecrets.pem ec2-user@$HOST \
    "tar xvf pc.tar && \
    cd my_project_source_code && \
    docker stop $(docker ps -a -q) && \
    docker rmi $(docker images -a -q) && \
    sh -c 'nohup docker-compose kill  > /dev/null 2>&1 &' && \
    docker-compose build --no-cache && \
    sh -c 'nohup docker-compose up > /dev/null 2>&1 &' "
当我在Jenkins中构建此作业时,它失败,输出控制台出现以下错误:

“docker stop”至少需要1个参数。见“码头工人站” --“救命”

用法:docker stop[选项]容器[容器…]

停止一个或多个正在运行的容器生成步骤“Execute shell” 构建为失败

所以我的问题是我的bash脚本有什么问题?

另请注意:


当我在CLI上ssh到EC2时,我能够运行docker stop$(docker ps-a-q)。但当相同的命令在Jenkins jobs bash shell脚本中运行时,它不会将其识别为有效脚本。我做错了什么?这似乎是我对如何在Jenkins Job的bash shell脚本中运行此命令的一些误解,但我不能完全确定。

如果希望脚本中的替换在远程运行,则需要在本地shell不会首先尝试对其求值的上下文中将其传递给
ssh
。双引号不是上下文

引用的heredoc符合以下条件:

ssh -o StrictHostKeyChecking=no -i MySecrets.pem "ec2-user@$HOST" 'bash -s' <<'EOF'
 tar xvf pc.tar                                        || exit
 cd my_project_source_code                             || exit
 docker stop $(docker ps -a -q)                        || exit
 docker rmi $(docker images -a -q)                     || exit
 sh -c 'nohup docker-compose kill  > /dev/null 2>&1 &' || exit
 docker-compose build --no-cache                       || exit
 sh -c 'nohup docker-compose up > /dev/null 2>&1 &'    || exit
EOF

ssh-o StrictHostKeyChecking=no-i MySecrets.pem“ec2 user@$HOST”'bash-s'将其置于双引号中会使命令替换在本地运行,而不是在远程端运行。顺便问一下,为什么
sh-c
?所有这些都已经在一个shell中运行了;为什么要调用另一个呢?另外,假设后台进程和脚本中的后续步骤之间的顺序通常是一个坏主意。您没有合理的依据相信,
docker compose kill
将在
docker compose build
在此之前可靠且一致地生效,特别是当您将额外的命令(如
sh
nohup
循环到前者的启动过程中时。另一方面,使用所有caps
HOST
作为变量名是个坏主意。请参阅--所有大写名称都用于对shell和OS有意义的变量,而带有小写字符的名称则保留给应用程序使用……也就是说:
docker compose kill>/dev/null 2>&1