摘要:是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。每个中只能有一个,当指定多个时,只有最后一个生效。是改变工作目录,则是改变之后层的执行以及这类命令的身份。
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
常用的选项例子:
FROM node:latest MAINTAINER my_name ADD ./my_project /code VOLUME ["/data1", "/data2"] WORKDIR /code RUN apt-get install mysql EXPOSE 6777 ENV SRC_URL www.xxxxxxxxxxx.com/xxxxxxx RUN wget $SRC_URL CMD ["node","bin/www"]
FROM: 指定基础镜像,如果本地不存在基础镜像,会自动从远程仓库拉取。FROM必须是Dockerfile中除了注释外的第一行语句。
MAINTAINER: 用于指定镜像的构建者,当发现坑的时候可以找他
ADD: 将本机的文件或目录复制到镜像的某个目录下,在后续的构建命令和容器运行中可以在容器中访问该目录
WORKDIR: 指定后续的构建命令的工作路径
RUN: 在镜像中运行某条命令,如安装相关的依赖库
CMD:用于指定镜像运行时的第一条命令。CMD只能出现一次,如果出现多次,前面的会被覆盖
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式; CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用; CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
EXPOSE:暴露容器的端口,其他容器可以通过该端口访问本容器提供的服务,前提是这些容器在同一个网络中,例子中暴露了6777端口
ENV: 设置环境变量。这些环境变量可以在后续的构建命令中使用,当运行容器时,也可以在容器中使用这些变量
COPY: 将本机的文件或目录复制到镜像的某个目录下,在后续的构建命令和容器运行中可以在容器中访问该目录。该命令作用同ADD,只是ADD更加强大,如:当拷贝的是压缩包,ADD会自动解压
ENTRYPOINT: 容器启动后执行的命令。每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。(CMD指令指定的容器启动时命令可以被docker run指定的命令覆盖;而ENTRYPOINT指令指定的命令不能被覆盖,而是将docker run指定的参数当做ENTRYPOINT指定命令的参数。)
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2(shell中执行)
VOLUME: 容器卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,将主机目录挂在到容器里面,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除,除非在删除容器的时候使用-v选项: docker rm -v container_id/container_name
注意: 数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷 。因此你的容器目录dir有一个文件为temp.data,如果你在dir挂载了一个数据卷
在Dockerfile中,无法指定主机上对应的目录
,那么你就再也不能读取temp.data,除非你移除该数据卷。
其他选项 USER格式:
USER <用户名>
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。 WORKDIR 是改变工作目录, USER 则是改变之后层的执行 RUN , CMD 以及 ENTRYPOINT 这类命令的身份。
当然,和 WORKDIR 一样, USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。
RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN [ "redis-server" ]
如果以 root 执行的脚本,在执行期间希望改变身份,比如希望以某个已经建立好的用户来运行某个服务进程,不要使用 su 或者 sudo ,这些都需要比较麻烦的配置,而且在 TTY 缺失的环境下经常出错。建议使用 gosu 。
# 建立 redis 用户,并使用 gosu 换另一个用户执行命令 RUN groupadd -r redis && useradd -r -g redis redis # 下载 gosu RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/ gosu-amd64" && chmod +x /usr/local/bin/gosu && gosu nobody true # 设置 CMD,并以另外的用户执行 CMD [ "exec", "gosu", "redis", "redis-server" ]ONBUILD
格式: ONBUILD <其它指令> 。
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN , COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
Dockerfile 中的其它指令都是为了定制当前镜像而准备的,唯有 ONBUILD 是为了帮助别人定制自己而准备的。
fundamental/Dockerfile
FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ]
project1/Dockerfile
FROM fundamental do other thing
在构建 project1 的时候 ONBUILD的命令才会生效。
例子我们将基于官方的python镜像,搭建一个后端的环境镜像(需要用的库含redis、flask等)。
FROM python:3.6-alpine # 复制代码到镜像 ADD the_path_of_project /code # 设置后面的命令的pwd WORKDIR /code # 安装依赖 RUN pip install redis flask # 运行服务的命令 CMD ["python", "app.py"]
例子中:
FROM:指定基础镜像为python:3.6-alpine
ADD:项目代码被复制到容器的code目录下
WORKDIR:指定后续命令的pwd为code
RUN:安装依赖库
CMD:指定启动容器时需要运行的命令,即启动我们的项目
参考docker pratice
上一节:Docker 笔记(1):介绍、镜像、容器及其基本操作
下一节:Docker 笔记(3):docker-compose
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27454.html
摘要:时间年月日星期六说明本文部分内容均来自慕课网。必填用于执行命令,当执行完毕后,将产生一个新的文件层。可选指定此镜像启动时默认执行命令。可选用于指定需要暴露的网络端口号。可选向镜像中挂载一个卷组。 时间:2017年09月16日星期六说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com 教学源码:无 学习源码:无 第一章:课程简介 1-1 课程介绍 Docke...
摘要:的主要作用是自己根据基础镜像,重新定制镜像,而不是直接从官方仓库拿现成的使用。以接下来要构建的环境来说明下,下面我将要搭建一个的开发环境,需要进行配合。它的主要作用是持久化数据,避免容器销毁后内部数据丢失暴露到宿主机的端口。 以前一直使用 Vagrant 作为自己的开发环境,并且在上家公司也推行大家采用 Vagrant 作为开发环境,保障公司使用的是同一套开发环境。随着docker的流...
摘要:的主要作用是自己根据基础镜像,重新定制镜像,而不是直接从官方仓库拿现成的使用。以接下来要构建的环境来说明下,下面我将要搭建一个的开发环境,需要进行配合。它的主要作用是持久化数据,避免容器销毁后内部数据丢失暴露到宿主机的端口。 以前一直使用 Vagrant 作为自己的开发环境,并且在上家公司也推行大家采用 Vagrant 作为开发环境,保障公司使用的是同一套开发环境。随着docker的流...
摘要:导读要从容器化开始,而容器又需要从开始,本文将介绍如何写出一个优雅的文件。只要记住以上三点就能写出不错的。执行完成项目的构建。 导读 Kubernetes要从容器化开始,而容器又需要从Dockerfile开始,本文将介绍如何写出一个优雅的Dockerfile文件。 文章主要内容包括: Docker容器 Dockerfile 使用多阶构建 感谢公司提供大量机器资源及时间让我们可以实践...
阅读 701·2021-11-24 10:30
阅读 1231·2021-09-24 09:48
阅读 3058·2021-09-24 09:47
阅读 3557·2019-08-29 17:11
阅读 2859·2019-08-29 15:38
阅读 2254·2019-08-29 11:03
阅读 3577·2019-08-26 12:15
阅读 990·2019-08-26 10:45