一、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