Dockerfile指令

CMD

CMD指令用于指定一个容器启动时要运行的命令。

注意和RUN指令的区别,RUN是指定镜像被构建时要执行的指令,而CMD是指定容器被指定时要运行的命令。

CMD ["/bin/bash","-l"]

需要注意的是要运行的命令是存在一个数组结构中的。

docker run 命令可以覆盖CMD指令。
如果在Dockerfile指定了CMD指令,而同时在docker run也指定了要运行的命令,命令中指定的命令会覆盖Dockerfile中的CMD指令。

在Dockerfile中只能指定一条CMD指令。如果指定了多条CMD指令,也只有最后一条指令会被使用。

ENTRYPOINT

ENTRYPOINT和CMD两个命令很相似,也容易混淆。 这两个指令有什么区别呢?
docker run命令会覆盖CMD指令,而ENTRYPOINT指令提供的命令则不容易在启动容器时被覆盖。
实际上,docker run命令指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中指定的指令。

FROM nginx:1.17.10
ENTRYPOINT ["/usr/sbin/nginx"]
docker build -t static-web .
docker run -ti static-web:latest -g "daemon off;" 

我们指定了-g "daemon off;"参数,这个参数会传递给ENTRYPOINT指定的命令,这里实际运行的是/usr/sbin/nginx -g "daemon off;"

WORKDIR

WORKDIR用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT或CMD指定的程序会在该目录下执行。

可以通过-w在运行时覆盖工作目录

➜ docker run -ti -w /var/log ubuntu pwd
/var/log

ENV

ENV指令用来在构建过程中设置环境变量。
这个环境变量可以后续的任何RUN命令中使用,也可以在后续其他指令中使用。这些环境变量会被持久保存到我们创建镜像创建的任何容器中。

FROM centos:centos7
ENV TARGET_DIR /test
docker build -t centos-local .
docker run -ti centos-local bash
[root@3cc881054afa /]# env | grep TARGET
TARGET_DIR=/test

也可以使用docker run -e来传递环境变量,这些变量将只在运行的容器有效。

docker run -ti -e xx=1 centos-local bash
[root@ab8d32138d52 /]# env | grep xx
xx=1

USER

USER指令指定该镜像会以什么样的用户去运行,可以指定用户和组。

USER user:group 
USER uid:gid

也可以在运行时通过docker run -u指定。

如果不通过USER指令指定用户,默认用户为root

VOLUME

VOLUME指令用来向基于镜像创建的容器添加卷。一个卷是可以存着一个或多个容器内的特定的目录,这个目录可以绕开 联合文件系统,并提供如共享数据或者对数据进行持久化的功能。

VOLUME ["/opt/project","/data"]

这条命令将会为基于此镜像创建的任何容器创建名为/opt/project和/data的挂载点。

ADD

ADD指令用来将构建环境下的文件和目录复制到镜像中, 不能对构建目录或者上下文之外的文件进行ADD操作。

ADD latest.tar.gz /var/www/wp/

Docker通过地址参数末尾的字符来判断文件是目录还是文件。如果以/结尾,Docker认为是目录,不是以/结尾,Docker就认为是文件。

Docker在处理源文件是tar归档文件时会自动解压。

如果目的位置不存在,Docker会自动创建全路径,包括路径中的任何目录。新创建的文件和目录权限是0755,并且GID和UID都是0。

ADD指令会使得构建缓存变得无效,这一点非常重要。

COPY

COPY指令非常类似ADD,不同的是COPY只关心在构建过程中复制本地文件,而不会去做文件提取和解压的工作。

COPY conf.d/ /etc/nginx 

COPY不能复制构建目录之外的文件,因为构建环境将会被上传到Docker守护进程,而复制是在Docker守护进程中进行的,任何位于构建环境之外的东西都是不可用的。

COPY指令的目的地址必须是一个容器内部的绝对路径。
如果目的位置不存在,Docker将会自动创建所在目录的目录结构,类似mkdir -p那样。

LABEL

LABEL指令用于为Docker镜像添加元数据,元数据以键值对的形式展示。
推荐将所有元数据都放到一条LABEL指令中,以防止不同元数据指令创建过多镜像层。

FROM centos:centos7
LABEL version="1.0" role="test" 

可以用docker inspect centos-local:latest命令查看容器标签。

STOPSIGNAL

STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器。
这个信号必须是内核系统调用表中合法的数,如9,或者SIGNAME格式中的信号名称,如SIGKILL。

ARG

ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量。我们只需要在构建时使用--build-arg标志即可。
用户只能在构建时指定Dockerfile文件中定义过的参数。

FROM centos:centos7
ARG PROFILE=DEV
docker build --build-arg PROFILE=beta -t centos-local .

为了安全,千万不要使用ARG来传递证书或者秘钥之类。

ONBUILD

ONBUILD指令能为镜像添加触发器(trigger)。当一个镜像被用着其他镜像的基础镜像时,该镜像的触发器将会被执行。
触发器会在构建过程中插入新指令,这些指令是紧跟在FROM之后指定的。

可以通过docker inspect查看ONBUILD指令。

OBBUILD触发器会按照在父镜像中指定的顺序执行,并且只能被继承一次(也就是说只能在子镜像中执行,而不会在孙子镜像中执行)。

# docker 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×