我有一行看起来像:
RUN for i in `x y z`; do echo "$i"; done
...打算打印三个项目中的每一个
但它引发了/bin/sh: 1: x: not found
知道我做错了吗?
答案 0 :(得分:12)
看起来你正在使用反引号。反引号中的内容会被执行,反引号中的文本会被结果返回的内容替换。
尝试使用单引号或双引号代替反引号。
尝试摆脱这样的反对:
RUN for i in x y z; do echo "$i"; done
答案 1 :(得分:3)
我实际上会建议另一种解决方法。
我们可以退一步,而不是在Docker文件中使用LOOP ......
在独立的bash脚本中实现循环;
这意味着你将拥有一个loop.sh如下:
RUN ./loop.sh
$(document).ready(function(){
var canales = ["umihyu", "smashdota", "vannDota", "ESL_SC2", "freecodecamp"];
var stream = "https://wind-bow.gomix.me/twitch-api/streams/";
var channels = "https://wind-bow.gomix.me/twitch-api/channels/";
for (i=0; i<canales.length; i++){
let logo;
let id;
let estado;
$.getJSON(stream + canales[i] + "/?callback=?", function(data){
if(data.stream==null){
//inicio funcion interna a canales
$.getJSON(channels + canales[i] + "/?callback=?", function(data1){
console.log(data1);
});
}
else {
console.log(data);
}
});
};
});
在您的Dockerfile中,只需执行:
public class Client {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
while (true) {
String fileName = sc.nextLine();
System.out.println(fileName);
try {
File file = new File(fileName);
Socket socket = new Socket("localhost", 15000);
OutputStream os = socket.getOutputStream();
Writer w = new OutputStreamWriter(os, "UTF-8");
w.write(fileName);
w.close();
os.flush();
byte[] mybytearray = new byte[(int) file.length()];
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
bis.read(mybytearray, 0, mybytearray.length);
os.write(mybytearray, 0, mybytearray.length);
os.flush();
os.close();
socket.close();
} catch (Exception e) { }
}
}
}
以这种方式做这件事的一个好处是:
它只需要一步,这将花费你一层。 您拥有的图层越少,图像尺寸就越小。
https://hackernoon.com/tips-to-reduce-docker-image-sizes-876095da3b34
答案 2 :(得分:0)
对于更易于维护的Dockerfile
,我的首选是在RUN
指令中使用多行带有注释的注释,尤其是如果将多个操作与&&
链接在一起
RUN sh -x \
#
# execute a for loop
#
&& for i in x \
y \
z; \
do \
echo "$i"
done \
\
#
# and tell builder to have a great day
#
&& echo "Have a great day!"
答案 3 :(得分:0)
我们可以做到
RUN for i in x \y \z; do echo "$i" "hi"; done
上面命令的输出将是
x嗨
嗨
z hi
答案 4 :(得分:-6)
您可以像使用shell命令一样执行循环,而不是使用Run
使用CMD
。
请查看此相关问题以供参考: Recursive while loop in docker cmd