“驴菜驴有理,你菜华骂你”
这是一个练手的小项目,已知docker容器名字为my_ubuntu,且已经开机.
通过外部运行API方式让本地1.txt 2.in 3.in传入docker的/app/exec路径下作为输入文件,执行可执行程序deal,最终获得1.ou 2.ou 3.ou再传入docker外,即本地.
1. docker的exec命令
对docker exec命令要有更深的认识,如下
sudo docker exec my_ubuntu /bin/bash
的意思是,在my_ubuntu的容器下执行/bin/bash
命令,那么问题就方便多了,比如
sudo docker exec my_ubuntu /bin/bash -c "ls"
就是列举当下docker文件夹下文件
2.再联合docker cp命令
- 逐句执行
sudo docker cp 1.txt my_ubuntu:app/exec
sudo docker cp 2.in my_ubuntu:app/exec
sudo docker cp 3.in my_ubuntu:app/exec
- 打开docker并且执行可执行文件
sudo docker exec my_ubuntu /bin/bash -c "cd /app/exec && chmod 777 . && ./deal"
- 将可执行文件传出,前边是镜像,后边是本地
sudo docker cp my_ubuntu:app/exec/1.ou . && sudo docker cp my_ubuntu:app/exec/2.ou . && sudo docker cp my_ubuntu:app/exec/3.ou .
3. 总结为一句命令行
这里为什么一个文件一个文件复制,因为docker cp 一次只支持一个文件, 我也别无他法,有更好的建议评论区告诉我,感谢
sudo docker cp 1.txt my_ubuntu:app/exec && sudo docker cp 2.in my_ubuntu:app/exec && sudo docker cp 3.in my_ubuntu:app/exec && sudo docker exec my_ubuntu /bin/bash -c "cd /app/exec && chmod 777 . && ./deal" && sudo docker cp my_ubuntu:app/exec/1.ou . && sudo docker cp my_ubuntu:app/exec/2.ou . && sudo docker cp my_ubuntu:app/exec/3.ou .
4. shell封装
写一个sh脚本,考虑到不是每个用户的容器都叫做my_ubuntu,所以加了read读取用户id,用户输入即可. 输入的变量存入CONTATINER中,$CONTATINER
可直接获取,在shell里是可以换行就代表一句,可以不加&&,个人习惯
#!/bin/bash
#@autor: 312
#@time: 2022 -10 -18 16:45
echo 'pleast type the name of container'
read -p "请输入您的容器名称(请确保容器已经开机)" CONTATINER
echo "您的容器名为"$CONTATINER
sudo docker cp 1.txt $CONTATINER:app/exec && sudo docker cp 2.in $CONTATINER:app/exec && sudo docker cp 3.in $CONTATINER:app/exec
echo "传入文件成功,开始执行"
sudo docker exec $CONTATINER /bin/bash -c "cd /app/exec && chmod 777 . && ./deal"
echo "执行成功,开始获取"
sudo docker cp $CONTATINER:app/exec/1.ou . && sudo docker cp $CONTATINER:app/exec/2.ou . && sudo docker cp $CONTATINER:app/exec/3.ou .
echo "生成文件已经拉取到本地"