构建喊图片的“ASCII牛(COWSAY)”docker 镜像
[toc]
COWSAY
cowsay 是一个生成ASCII图片的程序,显示一头牛的消息。它也可以使用预先制作的图像,以生成其他动物的图片,如Linux的吉祥物企鹅。由于它是用Perl编写的,它也适用于其他系统,如微软的Windows。有时,IRC、桌面截图和软件文档中会使用它。它更像黑客文化中的玩笑,但一段时间后,它也较常被一般人使用。在2007年,它被选为Debian的今日软件包。
简单的例子
$ cowsay "Hello, Yinguowei\!"
___________________
< Hello, Yinguowei! >
-------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
可能需要先安装:sudo apt-get install cowsay
fortune 命令
fortuen 是用来显示随机格言的一个 Linux 程序,用管道符把它和 cowsay 连起来: ```sh $ fortune | cowsay __________________________ /
| 现在,有右的东西影响我们,也有“左”的东西影响我们,但根深蒂固的还是“左”的东 | | 西 | | | \ - 邓小平 / —————————————————————————- \ ^^ \ (oo)___ (__)\ )\/
||—-w | || ||
如果提示没有这个命令,可以先安装下:`sudo apt-get install fortune`
### 中文 fortune
默认显示的格言是英文的,如果对上图中文的感兴趣,可以参考阮一峰的[博客](http://www.ruanyifeng.com/blog/2015/04/fortune.html)
### 换个动物
我们还可以换好多可爱的小动物来喊麦
$ cowsay -f sheep “Im Shaun…”
_____
< Im Shaun… >
————-
__
UooU.’@@@@@@.
\__/(@@@@@@@@@@)
(@@@@@@@@)
YY~~~~YY’
|| ||
支持的动物列表可以通过 `cowsay -l` 查看,其就是在 `/usr/share/cowsay/cows` 目录下的 `*.cow` 文件。
### 从源码编译 cowsay
GitHub 上 cowsay 的仓库有许多个,但是最老作为 Debian 发行的那个原版应该是[这个](https://github.com/tnalpgge/rank-amateur-cowsay) (看提交历史是从作者最早的 CVS 迁移来的,最早是 19 年前的代码!)
```sh
git clone https://github.com/tnalpgge/rank-amateur-cowsay.git
创建自定义的 cow
接下来开始做自己相关标识、商标的 ascii 图形
- 当然可以自己画,也可以从图片转(后面会讲到),也可以从一些 ascii 图库的网站找一个,比如: ascii-code.com, ASCII Art Archive,再做一些修改:
- 图形里的斜杠要替换为两个斜杠 ‘\\’
- 以
$thoughts
表示语言框的指引箭头 ‘\‘。其他还有些:$eyes
是眼睛,’oo’,$tongue
是舌头 ‘U’。 - 有个小 bug:每一行不能以 ‘\’ 或空格结尾,否则这行当中的所有空格都会被删掉,简单处理只要在每行最后加点东西就行了。
我做的金龙鱼:
\ |
\|
|\\\\_________
/=_/ o \ <_
|=_ ( v/
|/ \__________+___/ (R)
|/// |/|/
转成 cow 格式并放到 rank-amateur-cowsay/cows/arawana.cow
##
## A cow with an arawana, by yinguowei@gmail.com
##
$the_cow = <<EOC;
$thoughts |
$thoughts|
|\\\\\\\\_________
/=_/ o \\ <_
|=_ ( v/
|/ \\__________+___/ (R)
|/// |/|/
EOC
打包为 docker 镜像或者 Linux 命令
重新打包 cowsay
mv rank-amateur-cowsay cowsay
tar -czvf ascii-cow/cowsay.tar.gz cowsay
编写 Dockerfile
FROM alpine
# install cowsay
ADD cowsay.tar.gz /tmp
RUN apk-install perl &&\
cd /tmp/cowsay/ &&\
echo | ./install.sh &&\
rm -rf /tmp/cowsay
- 注意 apk-install 是 alpine Linux 的包管理工具,也可以转换成其他 Linux Docker 基础镜像的包管理工具。
我们也可以安装了 perl 来编译
yum install -y perl
./install.sh
编译完成后,就可以测试了:
$ cowsay -f arawana "Hello, Wilmar."
成功输出新的小龙鱼:
________________
< Hello, Wilmar. >
----------------
\ |
\|
|\\\\_________
/=_/ o \ <_
|=_ ( v/
|/ \__________+___/ (R)
|/// |/|/
接下来,我们开始创建彩色的 ascii 内容,并把图片直接转成 ascii。
im2a
im2a 是一个开源的图像转 ASCII 工具,支持256色终端。
安装 im2a
git clone https://github.com/tzvetkoff/im2a.git
源码编译安装
./bootstrap
./configure
make install
打包
tar -czvf ascii-cow/im2a.tar.gz im2a
或者可以:
在 docker 中编译安装
FROM alpine
# install im2a
ADD im2a.tar.gz /tmp
RUN apk-install imagemagick-dev &&\
apk-install --virtual build-dependencies make autoconf automake libtool gawk gcc g++ ncurses-dev &&\
cd /tmp/im2a/ &&\
./bootstrap &&\
./configure &&\
ln -s /usr/lib/liblcms2.so.2 /usr/lib/liblcms2.so &&\
ln -s /usr/lib/libfontconfig.so.1 /usr/lib/libfontconfig.so &&\
ln -s /usr/lib/libfreetype.so.6 /usr/lib/libfreetype.so &&\
ln -s /lib/libz.so.1 /lib/libz.so &&\
touch Makefile.am &&\
find . -exec touch {} \; &&\
make clean &&\
make install &&\
rm -rf /tmp/im2a &&\
apk del build-dependencies
测试一下
echo ${im2a $IM2A_ARGS -W "${WIDTH}" -H "${HEIGHT}" "${FILE}"}
最后,把喊话内容变成彩色的:
ascii-cow
ascii-cow Dockerfile 模板
基于 andrewmacheret 制作的基础镜像
git clone https://github.com/andrewmacheret/ascii-cow.git
和 cowsay 整合,用管道符连接
convert_image() {
im2a $IM2A_ARGS -W "${WIDTH}" -H "${HEIGHT}" "${FILE}" |
cowsay $COW_ARGS -n |
perl -p -e 's/(([-_]){'"${WIDTH}"'})[-_]+/\1\2\2/' |
perl -p -e 's/ +([|\/\\]) *$/ \1/'
}
定制 cows
重新编译 Dockerfile
mkdir node_modules
docker build -t yinguowei/ascii-cow .
如果不想重新编译进去新的小动物,也可以直接把 cow 文件拷贝到容器里的 cows 目录;甚至直接替换 default.cow 文件来让命令直接输出你想要的小动物:
npm install -g express
docker run -d yinguowei/ascii-cow
docker cp arawana.cow <CONTAINER_NAME|CONTAINER_ID>/usr/local/share/cows/
测试
docker run --rm -it yinguowei/ascii-cow ./ascii-cow.sh -u "https://avatars3.githubusercontent.com/u/1177503?v=3&s=230" -w 60
输入的原图是:
转换输出的 ascii 图:
设置终端使用白色字体的话:
文本内容是这样的:
______________________________________________________________
/ KKKKKKKKKKd..;;;;;;;;;;;;;;;;;;;;;;;;;;,,...';..dKKKKKKKKKKK \
| KKKKKKKKO;..;;;,,;.'.',. .,;;'...'. .',;;;,..oKKKKKXNXKK |
| KKKKKKKK0:.;,... ';;,. cMMMNMMMMMM |
| KKKKKKKKd; ,' .c'. ..;dl .,,.oMMMMMMMMMM |
| KKKKKKKKO.,'. .KMMWWWNX0Okl':kkOKXNWWWMMMl .;;.NMMMMMMMMM |
| KKKKKKK0.., lMMMMWWWWWWWWWWWWWWWWWWWWWMMMO .;.OXWMMMMMMM |
| WWNNNXX0d.' cMMMMWWWWWWWWWWWWWWWWWWWWWWWMMMx .;.cKKXMMMMNK |
| WWMMMMMMo.' NMMMWWWWWWWWWWWWWWWWWWWWWWWWWMMM. .,.KKKKKKKKKK |
| 00XMNXNNN.' d0koclkXWWWWWWWWWWWWWWWWWWXXXWMN ,.KKKKKKKKKK |
| 00NMK000Wl 'NOo;:;'..,oONWWWWWNkxo:,... ..l0O :KKKKKK0OOO |
| 00MMK0O:ox NMMXxooolclc:OWWWWk:loccloodO0WMW. ::0KKKOkkk |
| WWMMXKc;dl. 'MMMxlNo',Odx0NWWWWWKOlXx''xk,0MMM. .:d;cKKKOkkk |
| XNMMWMl,xl;'WMMMMMMWXNWNKNWWWWWWWNXWNXNWNWMMMMk.;lx,:KKKOkkk |
| 0XMX00clXd,.XMMMMMWWWWWWWWXlNWWWWWWWWWWWWWMMMMX.,dXlcKKKkkkk |
| 0NMK00x.0ckdlMMMWWWWWWWWW0O:XWWWWWWWWWWWWWWMMMcdkc0.dOkkkkkk |
| NWMK00XccolN.MMMWWWWWWWWNklkOkKWWWWWWWWWWWWMMN.Ncoc,kkkkkkkk |
| WMMMMMMMo;k0.KMMWWWWWWWWWXXKKXXWWWWWWWWWWWMMMl:0O,:kkkkkkkkk |
| 0MWKXXMMMO'l'cMMMWWWWWOkldolkKddodkkNWWWWMMMk.co.'okkkkkkkkk |
| KMN000MMMKkxd.OMMMWWWNXKkO0KKKKK0Ok0XWWWMMMK,XXNMX.kkkkkkkkk |
| NMX00KMMM0kkkx;:KMMMWWWWWNXKKKKXNWWWWWWMMMk.0NNNWW.xkkkkkkkk |
| MMWNNWMMWkkkkkkx:;dNMMWWWWXdodxNWWWWWMM0c,c.OWNWWM.okkkkkkkk |
| XMWWWMMMWkkkkkkkkkd'.cxXWWWWWWWWWWWXx: ;xkkx,ckxdd:.lxkkkkkk |
| XMX00KMMNkkxo:;;;;; ,' '::coxkkdl:;. ,. ,,,,loxOKXXX0dc:xkkk |
| NMK00XMMXx,..'''''. ',,..;lxxxdc;'.',, .', oWWWWWWWWWWWK'okk |
| MMXKKNMMO .,'....'.. ,,,,. .0N' .,,,,. ..'.'XWWWWWWXxOXMN.xk |
| MMMMMMMM;.,,........ .,' .. ... .,, ..... ,llloooodXWMM'0N |
| MMMMMMMM..,'......... .... ..... ........ONNNNNNWWWWM.XM |
| MMMMMMMM..,'................ ...............ONWWWWWWNXNM,KM |
| MMMMMMMM..,'..............'.. .,,,,'..........:lllclokWWM.WM |
\ MMMMMMMM..,,.............''. ................ lO0NNNNNWWk:MM /
--------------------------------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
看上去就是:
开始试一下新的小动物:
$ url='http://www.wilmar-international.com/wp-content/themes/wilmar/assets/images/wilmar_logo.jpg'
$ docker run --rm -it yinguowei/ascii-cow ./ascii-cow.sh -u "$url" -w 80 -c "-f arawana"
原图:
输出:
__________________________________________________________________________________
/ MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM \
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM |
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWKOkkk0NMMMWk:''',o0MN0kkkk0WMMMNx;''',dXMM |
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMKOkkkOXMMMMOc'...,cd0WMMM0o,...;xNMMMMM |
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXOkkkkKNKOxl;'...,dkc'...:kWMMMMMMMM |
| MMMMMMMMMMMMMMMMMMMMMMMKKNMMNXXWMMMMMMMMMMMMMMMN0kkkkkOXMMXd;....'cOMMMMMMMMMMMM |
| MMMMMMMMMMMMMMMMMMMMMMNxx0MMOxx0MMMMMMMMMMMMMMMMMMWKNMMMMMMMMWkoKMMMMMMMMMMMMMMM |
| MMMMMMMMMMMMMMMMMMMMMMMWWMMM0ddKMMMMMMMWNWMMMWNNWMMMMMMWNNNWMMMMMMMMMMNMMMMMMMMM |
| MMMM0ddOMMkdddkMM0dxWMNdxkMM0dxXMMddxOKKxdx00K0xdxMMMkxkOOxdxNMM0ddKkxxMMMMMMMMM |
| MMMMMkddNKdxkddKWdxXMMNdxkMM0ddXMMxddMMMNddOMMM0ddKMMNMMMWOddOMMKddkMMMMMMMMMMMM |
| MMMMMWxdxxxXMkdxkd0MMMNdxkMM0dd0MMxddMMMWddOMMM0ddKMMKkxXWKddOMMXdd0MMMMMMMMMMMM |
| MMMMMMKxddOMMNxddkMMMMNdxkMM0dd0MMxddMMMWddkMMM0ddKM0dd0MM0ddOMMXddOMMMMMMMMMMMM |
| MMMMMMM000MMMMX00WMMMMW000MMX00KMM000MMMW000MMMK00XMMKOkOKW0kOXMN00KMMMMMMMMMMMM |
| MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM |
\ MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM /
----------------------------------------------------------------------------------
\ |
\|
|\\\\_________
/=_/ o \ <_
|=_ ( v/
|/ \__________+___/ (R)
|/// |/|/
截图:
最后,如果对你的镜像满意的话,提交到 Docker Hub 共享给你的团队吧!
链接
- 本项目的源码 yinguowei/ascii-cow - GitHub
- docker 镜像 yinguowei/ascii-cow - Docker Hub