Featured image of post Dockerfile编写

Dockerfile编写

Dockerfile编写

今天也是摸鱼的一天没怎么看书,一直在玩Linux。并且在无意间看到了我之前下载的 DirectoryLister,就想着在Docker里面部署玩一下。

一开始我是没有想写Dockerfile的,直接在开了一个Ubuntu容器整的,但是想了想,以后想用肯定不方便,这个容器我随时随地都有可能废了它。所以就从网上看了看Dockerfile怎么写,开整!

首先我并不想介绍Dockerfile怎么样去写,网上的教程一大把,自己看就可以了 我是参考菜鸟教程的教程。

Dockerfile无非就是一个自动化的过程,至少在我看来就是这样的,可能我刚接触了解不深吧。但是按照这个思路是绝对可以写出来Dockerfile的,因为我自己就是例子🌰。

来看看我的build

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
7168 ◯ : docker build -t flt:v1.0 .
... ...
Removing intermediate container 8fe78ec98a65
 ---> da56585b17c1
Step 4/4 : CMD ["/root/np.sh"]
 ---> Running in 23bd36103ddd
Removing intermediate container 23bd36103ddd
 ---> 114c7dec7e2f
Successfully built 114c7dec7e2f
Successfully tagged flt:v1.0

选择基础镜像

因为Dockerfile是基于一些底层的镜像制作的,所以在这里我选择的是 ubuntu:20.04

因为我平时就是在Ubuntu环境使用的比较多,你要是使用CentOS更顺手你也可以选择使用Redhat系的基础镜像。

这里无可争议,过。

1
FROM ubuntu:20.04

配置环境变量

其实我这里也没有啥环境变量,我也不知道啥东西要设置为环境变量,就把DirectoryLister的版本号设置为环境变量了,方便以后升级。哈哈哈哈,比较菜只能想到这东西了。

1
ENV DL_VERSION 3.7.7

自动化运行命令

这里也没有啥好说的,有点Linux基础就可以,就是这个写法很操蛋!要不停的 && … … \,至于为什么要这样呢,我查了一下,说是一个RUN就是一层,你要是写太多RUN就会套太多层,非常的臃肿。这些暂时也不是我需要考虑的,别人怎么写,我就怎么写。

这里我遇到了一个自动化安装软件时,需要用户手动输入参数的问题,平时咱手动输入参数可以,但是这自动化的时候可不能这样呀,废了老大劲网上找到了解决办法,就是利用 debconf 提前配置好参数,详细解决办法见Ubuntu问答

这里我特喵的还是要喷一喷CSDN,妈的一篇帖子万人抄,也不管对不对,往自己的的账号里面薅就对了。妈的好几页都是垃圾文章,浪费我的时间。

自动化里面基本上就是安装软件修改配置等等,强化了一下我的awk和sed。这俩命令太重要了!一定要学好!

CMD命令

没错我直接跳到了CMD命令,啥COPYADDENTRYPOINTARGVOLUMEEXPOSEWORKDIRUSERHEALTHCHECKONBUILD 我都没有用上,真的是不知道在哪里用,也用不好,索性就不用了,直接一个CMD就打完收工。

CMD里面的脚本也是我倒腾半天网上学来的,这样写虽然不太优雅,但是总比一开始的时候,一运行就结束了好。说到这我就觉得这里还是有点坑的,因为Docker容器里面必须有一个前台的进程,要是没有进程就会整个容器停止运行,我一开始还傻傻的看网上的教程写nohup,写了半天也不行。然鹅nohup并不是真正的前台进程,因为你再按一次回车就直接退出来了,nohup并没有在前台继续运行,只是nohup的那个命令或者脚本没死在后台活着,但是前台没有进程就会直接退出。正是这种命令或者脚本还活着的幻觉让我们觉得这他妈的Docker是不是有病呀?我这居然还不行!

所以有些东西还是要靠自己慢慢的积累,网上很多东西也都是错误的,不知道我上面的观点对不对,欢迎指正。