什么是Dockerfile?
Dockerfile是一个包含用于构建镜像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成镜像。它们简化了从头到尾的流程并极大的简化了部署工作。
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
常用指令介绍
1. FROM:
# 指定镜像的基础镜像时,必须是第一条命令
# FROM <image>:<tag>
# FROM <image>@<digest>
# tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
FROM golang:1.12
2. MAINTAINER:
# 指明该镜像的作者及其电子邮件
MAINTAINER liuyh73 "xxxx@qq.com"
3. WORKDIR:
#设置镜像工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR $GOPATH/src/github.com/money-hub/MoneyDodo.service
4. ADD:
#将宿主机的文件复制到docker容器中(ADD <source> <destination>)
ADD . $GOPATH/src/github.com/money-hub/MoneyDodo.service
5. COPY:
#将宿主机的文件复制到docker容器中(COPY <source> <destination>)
COPY . $GOPATH/src/github.com/money-hub/MoneyDodo.service
【注】COPY和ADD使用方式基本一样,但是ADD会对压缩文件(tar, gzip, bzip2等)做提取和解压操作。
6. RUN:
# 在新镜像内部执行的命令,比如安装一些软件、配置基础环境等,可以使用"\"来换行
RUN go get ./...
# 也可以使用exec格式:RUN ["executable", "param1", "param2" ...]
# executable是命令,param为参数
RUN ["go get", "./..."]
7. EXPOSE:
# 暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来将镜像端口与宿主机的随机端口做映射
EXPOSE 8005
8. VOLUME:
# 1 卷可以容器间共享和重用
# 2 容器并不一定要和其它容器共享卷
# 3 修改卷后会立即生效
# 4 对卷的修改不会对镜像产生影响
# 5 卷会一直存在,直到没有任何容器在使用它
VOLUME ["/path/to/dir"]
9. ENV:
# 设置环境变量
# ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
# ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对
ENV PORT=8005
10. CMD:
# 构建容器后调用,也就是在容器启动时才进行调用
# CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令
CMD command param1 param2
# 也可以使用exec语法
# CMD ["executable","param1","param2"]
11. ENTRYPOINT:
用法和CMD一样,但是CMD的命令会被 docker run
的命令覆盖而ENTRYPOINT不会。docker run
命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
当CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖。
示例
#源镜像
FROM golang:1.12
#设置镜像工作目录
WORKDIR $GOPATH/src/github.com/money-hub/MoneyDodo.service
#将宿主机的go工程代码加入到docker容器中
ADD ../ $GOPATH/src/github.com/money-hub/MoneyDodo.service
# 安装依赖包
RUN go get ./...
#暴露端口
EXPOSE 8005
#最终运行docker的命令
ENTRYPOINT ["go run", "./cpt/cmd/main.go"]