dockerfile小结

FROM 指定基础镜像
RUN 执行命令
RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。
例:RUN echo ‘<h1>Hello, Docker!’ > /usr/share/nginx/html/index.html
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”],这更像是函数调用中的格式。

注:在撰写 Dockerfile 的时候,这并不是在写 Shell 脚本,而是在定义每一层该如何构建。确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。

例子:
FROM debian:stretch

RUN buildDeps='gcc libc6-dev make wget' \
	&& apt-get update \
	&& apt-get install -y $buildDeps \
	&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
	&& mkdir -p /usr/src/redis \
	&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
	&& make -C /usr/src/redis \
	&& make -C /usr/src/redis install \
	&& rm -rf /var/lib/apt/lists/* \
	&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps

构建镜像
docker build [选项] <上下文路径/URL/->
例:docker build -t nginx:v3 .

这行命令指定了构建所需的 Git repo,并且指定默认的 master 分支,构建目录为 /11.1/,然后 Docker 就会自己去 git clone 这个项目、切换到指定分支、并进入到指定目录后开始构建。
docker build https://github.com/twang2218/gitlab-ce-zh.git#:11.1

用给定的 tar 压缩包构建, Docker 引擎会下载这个包,并自动解压缩,以其作为上下文,开始构建。
docker build http://server/context.tar.gz

从标准输入中读取 Dockerfile 进行构建
docker build - < Dockerfile 或 cat Dockerfile | docker build -
如果标准输入传入的是文本文件,则将其视为 Dockerfile,并开始构建。这种形式由于直接从标准输入中读取 Dockerfile 的内容,它没有上下文,
因此不可以像其他方法那样可以将本地文件 COPY 进镜像之类的事情。

从标准输入中读取上下文压缩包进行构建
docker build - < context.tar.gz

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD,ADD和COPY格式用法一致。

CMD格式和RUN相似。
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]会被解析为json数组,所以必须双引号

CMD service nginx start启动后容器执行后就退出了,对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,
从而退出,其它辅助进程不是它需要关心的东西。而使用 service nginx start 命令,则是希望 upstart 来以后台守护进程形式启动 nginx 服务。
CMD service nginx start 会被理解为 CMD [ "sh", "-c", "service nginx start"],因此主进程实际上是 sh。
那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了,自然就会令容器退出。
正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。
CMD ["nginx", "-g", "daemon off;"]


ENTRYPOINT和CMD类似,ENTRYPOINT 后,CMD 的内容将会作为参数传给 ENTRYPOINT。
作用:1.让镜像变成像命令一样使用。2.应用运行前的准备工作(后接shell脚本)。如:ENTRYPOINT ["docker-entrypoint.sh"]

设置环境变量
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
调用:$key

ARG <参数名>[=<默认值>]
ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但不要因此就使用 ARG 保存密码之类的信息, docker history 还是可以看到所有值的。

VOLUME 定义匿名卷
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
docker run时,可覆盖匿名卷

EXPOSE <端口1> [<端口2>...]
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。
在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

WORKDIR <工作目录路径>改变工作目录

USER <用户名>[:<用户组>] 指定当前用户

HEALTHCHECK 健康检查
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

保存镜像
docker save alpine -o filename
可使用gz压缩:docker save alpine | gzip > alpine-latest.tar.gz
对应的加载镜像:docker load -i alpine-latest.tar.gz

结合这两个命令以及 ssh 甚至 pv 的话,利用 Linux 强大的管道,我们可以写一个命令完成从一个机器将镜像迁移到另一个机器,并且带进度条的功能:
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值