Docker容器内交互式shell上的源脚本

时间:2018-05-08 15:18:02

标签: bash docker

我想打开一个交互式shell,它会在我绑定mount的存储库中使用bitbake环境来源脚本:

public ArrayList<String> convert(ArrayList<Bitmap> bitmap){
    ArrayList<String> pics=new ArrayList<>();
    for(int i=0;i<bitmap.size();i++){
        pics.add(getStringImage(bitmap.get(i)));
    }
    return pics;
}
public static String getStringImage(Bitmap bmp){
    //I've givent maxSize as 500
    int outWidth;
    int outHeight;
    int inWidth = bmp.getWidth();
    int inHeight = bmp.getHeight();
    if(inWidth > inHeight){
        outWidth = maxSize;
        outHeight = (inHeight * maxSize) / inWidth;
    } else {
        outHeight = maxSize;
        outWidth = (inWidth * maxSize) / inHeight;
    }

    Bitmap new_bitmap = Bitmap.createScaledBitmap(bmp, outWidth, outHeight, false);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    new_bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    byte[] imageBytes = baos.toByteArray();
    String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    return encodedImage;
}

// Sending to server
final JSONObject obji=new JSONObject();
                    try {
                        //bit is arraylist of bitmap
                        obji.put("uploads_username",username);
                        obji.put("uploads",convert(bit));
                        socket.emit("data",obji);
                        }catch(Exception e){
                                }

问题是docker run --rm -it \ --mount type=bind,source=$(MY_PATH),destination=/mnt/bb_repoistory \ my_image /bin/bash -c "cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh" 参数似乎没有任何影响,因为shell在执行-it后立即退出

我也试过这个:

cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh

它生成了一个交互式shell,但没有docker run --rm -it \ --mount type=bind,source=$(MY_PATH),destination=/mnt/bb_repoistory \ my_image /bin/bash -c "cd /mnt/bb_repoistory/oe-core && source build/conf/set_bb_env.sh && bash"

中定义的宏

是否有办法为tty提供正确源代码的脚本?

1 个答案:

答案 0 :(得分:1)

-it标志与要运行的命令冲突,因为您告诉docker创建伪终端(ptty),然后在该终端中运行命令(bash -c ... )。当该命令完成时,运行完成。

有些人为解决这个问题所做的工作是在源环境中只有export个变量,最后一个命令是exec bash。但是如果您需要别名或其他不能继承的项目,那么您的选项会受到更多限制。

您可以在目标shell中运行它,而不是在父shell中运行源代码。如果您修改了.bash_profile以包含以下行:

[ -n "$DOCKER_LOAD_EXTRA" -a -r "$DOCKER_LOAD_EXTRA" ] && source "$DOCKER_LOAD_EXTRA”

然后你的命令是:

... /bin/bash -c "cd /mnt/bb_repository/oe-core && DOCKER_LOAD_EXTRA=build/conf/set_bb_env.sh exec bash"

可能有用。这告诉你的.bash_profile在已经设置env变量时加载这个文件,但不是。 (docker命令行上也可以有-e标志,但我认为它会为整个容器设置全局,这可能不是你想要的。)