一、Dockerfile 常用指令概览

Dockerfile 的常用命令如下:

  • FROM:继承基础镜像
  • MAINTAINER:镜像制作作者的信息,已弃用,使用 LABEL 替代
  • LABEL:k=v 形式,将一些元数据添加至镜像
  • RUN:用来执行 shell 命令
  • EXPOSE:暴露端口号
  • CMD:启动容器默认执行的命令,会被覆盖
  • ENTRYPOINT:启动容器真正执行的命令,不会被覆盖
  • ENV:配置环境变量
  • ADD:复制文件到容器,一般拷贝文件,压缩包自动解压
  • COPY:复制文件到容器,一般拷贝目录
  • WORKDIR:设置容器的工作目录
  • USER:容器使用的用户
  • ARG:设置编译镜像时传入的参数

二、Dockerfile 常见写法与场景

2.1 创建用户

编写Dockerfile

FROM centos:7
MAINTAINER dot
RUN useradd dot

执行构建

docker build -t centos:user .

2.2 添加环境变量

编写Dockerfile

FROM centos:7
MAINTAINER dot
RUN useradd dot

执行构建

docker build -t centos:user .

2.3 ENTRYPOINT

编写Dockerfile

FROM centos:7
MAINTAINER dot
RUN useradd dot
RUN mkdir dot
ENV envir=test version=1.0
ENTRYPOINT echo "envir:$envir version:$version"

执行构建

docker build -t centos:entrypoint .

启动容器

docker run --rm centos:entrypoint

2.4 CMD 和 ENTRYPOINT 区别

CMD 可以被覆盖:

docker run --rm centos:env-cmd echo "cover..."

ENTRYPOINT 指定的不能被直接覆盖:

docker run --rm centos:entrypoint cannot cover...

ENTRYPOINT 指定--entrypoint 参数,比如指定 entrypoint 为 ls,后置命令为/tmp,就相当于ENTRYPOINT 是 ls,CMD 是/tmp

docker run --rm --entrypoint=ls centos:entrypoint /tmp

2.5 ADD 和 COPY

使用 ADD 添加一个压缩包,使用 WORKDIR 改变工作目录:

FROM nginx
MAINTAINER dot
ADD ./index.tar.gz /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html

使用 COPY 拷贝指定目录下的所有文件到容器,不包括本级目录。此时只会拷贝 webroot 下的所有文件,不会将 webroot 文件夹拷贝过去:

FROM nginx
MAINTAINER dot
ADD ./index.tar.gz /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html
COPY webroot/ .

2.6 更改启动用户

FROM centos:7
MAINTAINER dot
ADD ./index.tar.gz /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html
COPY webroot/ .
RUN useradd -m tomcat -u 1001
USER 1001

LABEL 和 MAINTAINER

# Dockerfile使用MAINTAINER定义作者信息,但是这个参数将来会被弃用,可以使用LABEL进行替换:
FROM centos:7
# MAINTAINER dot # 即将废弃
LABEL maintainer="dot" version="demo"
LABEL multiple="true"

制作镜像并查看镜像信息:

docker build -t test:label .
docker inspect test:label | grep Labels -A 10

2.7 Dockerfile 传参

使用 ARG 和 build-arg 传入动态变量:

# base image
FROM centos:7
# MAINTAINER dot # deprecated
LABEL maintainer="dot" version="demo"
LABEL multiple="true"
ARG USERNAME
ARG DIR="defaultValue"
RUN useradd -m $USERNAME -u 1001 && mkdir $DIR

构建启动

docker build --build-arg USERNAME="test_arg" -t test:arg .

docker run -ti --rm test:arg bash

验证查看

[root@fe7a40927736 /]# tail -1 /etc/passwd