Forwarded from 永久封存 | Yuuta 台 | 😷 #Pray4Wuhan (Yuuta #wontfix)
blog.yuuta.moe
使用 Docker 多阶段构建来减小镜像大小
这是一篇从前博客迁移来的文章。
Forwarded from duangsuse Throws
#Docker #learn #blog 这里我快速的给还没有看的大家写一个快速知识获取笔记(就是我之前偶尔写的阅读笔记):
+ Trumeet 这么做是为了让 Docker 构建(like CI Build)程序(like Java/Gradle)时更省内存资源和减小 Docker 镜像大小
»» 优化前
+ 每个阶段间独立,使用
Trumeet 的意思就是,分阶段『构建、运行』可以省内存和镜像大小,原理就是首先『做菜』
需要锅(构建工具链)、调料(构建配置)、菜(源代码)什么的
然后上菜(
+
+
+
+ Trumeet 这么做是为了让 Docker 构建(like CI Build)程序(like Java/Gradle)时更省内存资源和减小 Docker 镜像大小
»» 优化前
FROM openjdk:8u171-jdk-alpine3.8
ADD . /app
WORKDIR /app
RUN apk add maven \
&& mvn clean package \
&& apk del maven \
&& mv target/final.jar / \
&& cd / \
&& rm -rf /app \
&& rm -rf /root/.m2
ENTRYPOINT java -jar /final.jar
»» 优化后FROM openjdk:8u171-jdk-alpine3.8 as builderADD . /app
WORKDIR /app
RUN apk add maven \
&& mvn clean package \
&& apk del maven \
&& mv target/final.jar /
# 删了后面几条 rm -rf 命令
FROM openjdk:8u181-jre-alpine3.8 as environmentWORKDIR /
COPY --from=builder /final.jar .ENTRYPOINT java -jar /final.jar
我们总结一下,就是把 JRE 和 JDK 分开,首先 JDK builder 生成 JAR 文件,然后 COPY --from=builder /final.jar . 拷贝 artifacts 到 runtime 环境,然后 entrypoint 执行 java -jar final.jar
+ 多阶段构建是 Docker 17.05 的新增功能,它可以在一个 Dockerfile 中使用多个 FROM 语句,以创建多个 Stages+ 每个阶段间独立,使用
COPY --from <stage> <dst> 来获取其它阶段的文件Trumeet 的意思就是,分阶段『构建、运行』可以省内存和镜像大小,原理就是首先『做菜』
需要锅(构建工具链)、调料(构建配置)、菜(源代码)什么的
然后上菜(
COPY 复制 JAR 包部署),这时锅什么的都不需要了,只存在『享用』菜品的开销,它把『做菜并品尝』的系统资源平摊到『做菜』和『品尝』两个部分,各有各的环境和需要的器材,可以达到省体积和内存的效果+
docker build --target build1 . 是可以用的,猜猜它做什么+
COPY --from=0 /demo/hi-1.txt /demo 也是可以用的,猜猜 0 和使用名字的版本有什么区别+
docker save <tag> > docker.tar 猜猜是做什么 // 重新构建并保存(Save)
duangsuse Throws
#Docker #learn #blog 这里我快速的给还没有看的大家写一个快速知识获取笔记(就是我之前偶尔写的阅读笔记): + Trumeet 这么做是为了让 Docker 构建(like CI Build)程序(like Java/Gradle)时更省内存资源和减小 Docker 镜像大小 »» 优化前 FROM openjdk:8u171-jdk-alpine3.8 ADD . /app WORKDIR /app RUN apk add maven \ && mvn clean package…
分段构建并不能节省内存使用吧。而且不仅仅能节省空间,同时也能节省了 image 的layer(优化前比优化后少了 RUN 的那个 layer)
#learn https://gist.github.com/duangsuse/5ca62db55f06d4d97d72729d11a3e6d3#file-r2-debug-data-md 好耶!
呃,其实因为我开始功课做得有点不足,然后就有点错漏,包括 x86 和 x86_64 的调用约定差别我没注意到,死认为参数必须靠栈传递了,导致教程写错
最后一段其实也有错误,不过不管哪里有错,希望大家能接受。
那么这教的大概就是一些基本的 native 动态分析技能,如此。在 x86 上有点区别,不过更简单一些了应该(x86 上参数基本都是栈上分配,不是按通用寄存器传递)
简化嘛... 比较难,因为我懒了而且都是干货,底层的事情不是几个接口定义就完成的,而且这写了两个小时了...
呃,其实因为我开始功课做得有点不足,然后就有点错漏,包括 x86 和 x86_64 的调用约定差别我没注意到,死认为参数必须靠栈传递了,导致教程写错
最后一段其实也有错误,不过不管哪里有错,希望大家能接受。
那么这教的大概就是一些基本的 native 动态分析技能,如此。在 x86 上有点区别,不过更简单一些了应该(x86 上参数基本都是栈上分配,不是按通用寄存器传递)
简化嘛... 比较难,因为我懒了而且都是干货,底层的事情不是几个接口定义就完成的,而且这写了两个小时了...
Gist
Radare 2 动态调试基本使用和基本 x86_64 汇编教程
Radare 2 动态调试基本使用和基本 x86_64 汇编教程. GitHub Gist: instantly share code, notes, and snippets.
Forwarded from dnaugsuz
这个教程教了如何 hack 下面这一小段程序,虽然有些纰漏,喜欢学习的同学们欢迎过目(
+ 动态修改
+ 找到指针
+ 动态修改
main() 的参数 argc 和返回值+ 找到指针
str 指向地址,并且覆写堆数据#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *msg = "duangsuse 菜鸡\n";
int main(int argc, const char **argv) {
char *str = malloc(sizeof(msg)); strcpy(str, msg);
if (argc > 1) printf(str);
return -1;
}Forwarded from duangsuse Throws
#statement #PL #tech #Android #dev 你们知不知道为什么我很喜欢说我『幼稚』? 🤔
首先,有些大佬就是非常喜欢说自己『幼稚』,可能他们也和我有一样的遭遇吧(笑)
『我怕被垃圾骚扰』 — 看,多直白,我都从来不说如此丧气的话,然而,现在在学高级类型和静态分析理论的不是这个会尊重别人的我(笑)
垃圾是什么? — 不知道自己不知道的人
幼稚,这是曾经某个 Android 开发者(which 现在在巨硬 M$ 工作,当然这个他自己说的,不需要经过允许)对我的评价(之前的某件不愉快的事)
所以我想我永远都是幼稚的,感谢他的祝福,Stay hungry, stay foolish.
真正的保持饥饿、保持愚蠢,从此不要再毫无执行能力,不要再被接口,再被一个表面积蒙住双眼
是时候让理想变成现实了
有了技术,方可实现计划
我会永远保持幼稚和愚蠢 — 对我看我自己来说,以便孜孜不倦地学习到新知识,提升各方面自己的认知层次,或许
没错,可能就是这样吧,如果自己想学的更『不同于常人』一些,就要接受别人不一样的眼光,或许有鼓励、或许有批判
但一定要坚持走下去,坚持追根究底的学习态度
我的目光从来不应该停留在理解接口定义和接口文档的层次上,无论是 Web 开发、桌面和移动应用开发、嵌入式还是程序设计语言理论
我不想在诸如 Vim/Emacs(吐槽,你们这些争论他们好坏的,真的用他们吗?你们知道啥是 Emacs Lisp 啥是 VimScript 吗?)意识形态之争
和板凳条凳(参考鲁迅《阿 Q 正传》),名字叫函数式还是面向函数的问题上纠结
有些争论是没有太大意义的,技术上真正深度的变迁,从一个普通的用户、到系统管理员、到开发者、再到开发者所依赖的开发者
从只会使用应用程序,到只会理解代码、抄改代码,到真正理解并且会编写代码,到看透代码和各种理念背后的东西
我要一步一步走上去,我想这就是我的路,我『不喜欢』的数学阻止不了我,如果我需要数学,我就会喜欢它
但如果有一天 duangsuse 真的能赶上巨佬们的步伐,duangsuse 要真心为想学习的人考虑,好好的回答,永远不去扭曲别人
希望真能这样吧,,,
首先,有些大佬就是非常喜欢说自己『幼稚』,可能他们也和我有一样的遭遇吧(笑)
『我怕被垃圾骚扰』 — 看,多直白,我都从来不说如此丧气的话,然而,现在在学高级类型和静态分析理论的不是这个会尊重别人的我(笑)
垃圾是什么? — 不知道自己不知道的人
幼稚,这是曾经某个 Android 开发者(which 现在在巨硬 M$ 工作,当然这个他自己说的,不需要经过允许)对我的评价(之前的某件不愉快的事)
所以我想我永远都是幼稚的,感谢他的祝福,Stay hungry, stay foolish.
真正的保持饥饿、保持愚蠢,从此不要再毫无执行能力,不要再被接口,再被一个表面积蒙住双眼
是时候让理想变成现实了
有了技术,方可实现计划
我会永远保持幼稚和愚蠢 — 对我看我自己来说,以便孜孜不倦地学习到新知识,提升各方面自己的认知层次,或许
没错,可能就是这样吧,如果自己想学的更『不同于常人』一些,就要接受别人不一样的眼光,或许有鼓励、或许有批判
但一定要坚持走下去,坚持追根究底的学习态度
我的目光从来不应该停留在理解接口定义和接口文档的层次上,无论是 Web 开发、桌面和移动应用开发、嵌入式还是程序设计语言理论
我不想在诸如 Vim/Emacs(吐槽,你们这些争论他们好坏的,真的用他们吗?你们知道啥是 Emacs Lisp 啥是 VimScript 吗?)意识形态之争
和板凳条凳(参考鲁迅《阿 Q 正传》),名字叫函数式还是面向函数的问题上纠结
有些争论是没有太大意义的,技术上真正深度的变迁,从一个普通的用户、到系统管理员、到开发者、再到开发者所依赖的开发者
从只会使用应用程序,到只会理解代码、抄改代码,到真正理解并且会编写代码,到看透代码和各种理念背后的东西
我要一步一步走上去,我想这就是我的路,我『不喜欢』的数学阻止不了我,如果我需要数学,我就会喜欢它
但如果有一天 duangsuse 真的能赶上巨佬们的步伐,duangsuse 要真心为想学习的人考虑,好好的回答,永远不去扭曲别人
希望真能这样吧,,,
Forwarded from dnaugsuz
还好我起码是个 UNIX-Like 幼稚系统管理员,并且有 Arch LiveCD 的 U 盘在旁边...
duangsuse::Echo pinned «#statement #PL #tech #Android #dev 你们知不知道为什么我很喜欢说我『幼稚』? 🤔 首先,有些大佬就是非常喜欢说自己『幼稚』,可能他们也和我有一样的遭遇吧(笑) 『我怕被垃圾骚扰』 — 看,多直白,我都从来不说如此丧气的话,然而,现在在学高级类型和静态分析理论的不是这个会尊重别人的我(笑) 垃圾是什么? — 不知道自己不知道的人 幼稚,这是曾经某个 Android 开发者(which 现在在巨硬 M$ 工作,当然这个他自己说的,不需要经过允许)对我的评价(之前的某件不愉快的事)…»
duangsuse::Echo
#learn https://gist.github.com/duangsuse/5ca62db55f06d4d97d72729d11a3e6d3#file-r2-debug-data-md 好耶! 呃,其实因为我开始功课做得有点不足,然后就有点错漏,包括 x86 和 x86_64 的调用约定差别我没注意到,死认为参数必须靠栈传递了,导致教程写错 最后一段其实也有错误,不过不管哪里有错,希望大家能接受。 那么这教的大概就是一些基本的 native 动态分析技能,如此。在 x86 上有点区别,不过更简单一些了应该(x86…
那么既然看了这个显然就是有基本的对『黑盒』的动态分析能力了
恭喜你,你又打破了一个黑盒。
很多人终身都无法理解的,深邃黑暗
当然也是很多人认为『几乎没有办法』分析的东西
👆 是针对只会用被人包装好即拆即用的反编译器的前端来说
下一步可能是学习如何写 SIMD 平台指令(比如 AVX、SSE、NEON,跑
(讲道理,如果不知道如何在 C 里面
我呢,下面说 Android 平台上的... 原生机器代码调试
因为 Radare 2 实际上支持 Dalvik 的字节码格式,换句话说如果没有 Smali 之类的字节码工具,单上 r2 也可以完全胜任分析任务
而且分析功能还会更为强大,因为 Radare 2 本身就是为逆向分析而生的
至于 Dalvik 平台的动态分析可以用 Python 工具 Andbug,本频道之前也有讲使用 Andbug 对混淆后 classes 的动态分析(寻找反修改逻辑)
即便原作者使用 Proguard 将绝大部分的『名字』都替换为无意义的东西甚至使用了重打包(尽可能将无关类移动到根节点上,藏叶于林,使手工静态分析几乎不可能完成)
动态分析简单打下几个断点,然后让应用正常执行在两个小时内可以找到相关逻辑的位置,体现了动态分析『抓重点』的强大性能
恭喜你,你又打破了一个黑盒。
很多人终身都无法理解的,深邃黑暗
当然也是很多人认为『几乎没有办法』分析的东西
👆 是针对只会用被人包装好即拆即用的反编译器的前端来说
下一步可能是学习如何写 SIMD 平台指令(比如 AVX、SSE、NEON,跑
(讲道理,如果不知道如何在 C 里面
asm 内联汇编,学这些也没太大用,所以可以先了解 GCC 的 Assembly I/O Templating 机制(跑我呢,下面说 Android 平台上的... 原生机器代码调试
因为 Radare 2 实际上支持 Dalvik 的字节码格式,换句话说如果没有 Smali 之类的字节码工具,单上 r2 也可以完全胜任分析任务
而且分析功能还会更为强大,因为 Radare 2 本身就是为逆向分析而生的
至于 Dalvik 平台的动态分析可以用 Python 工具 Andbug,本频道之前也有讲使用 Andbug 对混淆后 classes 的动态分析(寻找反修改逻辑)
即便原作者使用 Proguard 将绝大部分的『名字』都替换为无意义的东西甚至使用了重打包(尽可能将无关类移动到根节点上,藏叶于林,使手工静态分析几乎不可能完成)
动态分析简单打下几个断点,然后让应用正常执行在两个小时内可以找到相关逻辑的位置,体现了动态分析『抓重点』的强大性能
duangsuse::Echo
那么既然看了这个显然就是有基本的对『黑盒』的动态分析能力了 恭喜你,你又打破了一个黑盒。 很多人终身都无法理解的,深邃黑暗 当然也是很多人认为『几乎没有办法』分析的东西 👆 是针对只会用被人包装好即拆即用的反编译器的前端来说 下一步可能是学习如何写 SIMD 平台指令(比如 AVX、SSE、NEON,跑 (讲道理,如果不知道如何在 C 里面 asm 内联汇编,学这些也没太大用,所以可以先了解 GCC 的 Assembly I/O Templating 机制(跑 我呢,下面说 Android…
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Quinn Chen
... 所以啊,就猜到是 Sketch 画的,4WH27ZUYV7X3ZDHEXSNOPFF34S4KVZM3X3X3ZDHFWCY6LPUI4WHITZNOWPSLTCBOFYXAU===(并非针对这件事,只是感叹一些无需考虑的之前的细节什么的)
Quinn Chen
Quinn Chen: http://quinnchen.me/2018/09/13/2018-09-13-asm-transform/ 分享一篇刚写完的博客
这个博文写的真的很好,临时看了一下,实在是不错,作者是 Hunter Java AOP 框架的作者
推荐大家阅读,因为干货实在是很多所以暂时就不会写笔记,或许以后有时间了再读下
推荐大家阅读,因为干货实在是很多所以暂时就不会写笔记,或许以后有时间了再读下