如何使用从java调用的shell脚本login,标记和推送Docker镜像到AWS

您好,我正尝试通过shell命令编程将Docker镜像推送到AWS EC2容器服务。 但是我遇到了麻烦,我得到以下错误信息:

错误获取凭据 – 错误:exec:“docker-credential-osxkeychain”:在$ PATH中找不到可执行文件,out:“没有基本的身份validation凭证

这个错误信息是从我的java类返回的。 如果我启动shell脚本forms的terminal,我没有问题,只有当我从我的java类开始它。 我创build了一个config.js文件添加到它的osxkeychain,因为我认为这可能会保存问题。

这是我的Dockerfile:

FROM java:7 COPY . /Users/betzenben/Desktop/OGC/Projects/Getting_started/Docker/Directory WORKDIR /Users/betzenben/Desktop/OGC/Projects/Getting_started/Docker/Directory RUN javac Time_app.java CMD ["java", "Time_app"] Run : ~/Users/betzenben/Desktop/OGC/Projects/Getting_started/Docker/Directory/config.json 

这是我的config.json文件

 { "apps": [ { "credsStore": "osxkeychain" } ] } 

以防万一需要我的shell脚本代码和我的java类调用shell脚本。

 #!/bin/sh echo “test1” getLoginKey="/usr/local/bin/" getLoginKey+="$(/usr/local/bin/aws ecr get-login --no-include-email --region us-west-2)" echo “test2” echo "${getLoginKey}" executeLoginKey="$(eval $getLoginKey)" echo “test3” sleep 2 echo "${executeLoginKey}" tagImage="$(/usr/local/bin/docker tag time_app:latest .....id......dkr.ecr.us-west-2.amazonaws.com/time_a:latest)" pushImage="$(/usr/local/bin/docker push .....id.......dkr.ecr.us-west-2.amazonaws.com/time_a:latest)" wait echo “test4” sleep 5 echo "${pushImage}" echo "Image Pushed" 

Java代码:

 import java.io.*; public class Main { public static void main(String[] args) throws InterruptedException, IOException { Process p1 = Runtime.getRuntime().exec("chmod +x /Users/betzenben/Desktop/tag_push_image_AWS.sh"); BufferedReader stdInput1 = new BufferedReader(new InputStreamReader(p1.getInputStream())); BufferedReader stdError1 = new BufferedReader(new InputStreamReader(p1.getErrorStream())); System.out.println("STDOUT:\n"); String s1 = null; while ((s1 = stdInput1.readLine()) != null) { System.out.println(s1); } System.out.println("STDERR:\n"); while ((s1 = stdError1.readLine()) != null) { System.out.println(s1); } Process p = Runtime.getRuntime().exec("/Users/betzenben/Desktop/tag_push_image_AWS.sh"); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); System.out.println("STDOUT:\n"); String s = null; while ((s = stdInput.readLine()) != null) { System.out.println(s); } System.out.println("STDERR:\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); } } } 

在你的tag_push_image_AWS.sh文件中改变

 #!/bin/sh 

 #!/bin/bash 

如果这不起作用,那么请尝试下面的代码在Java中

 Runtime.getRuntime().exec(new String[]{"/bin/bash","-lc", "/Users/betzenben/Desktop/tag_push_image_AWS.sh"});