赞
踩
Dockerfile是一个文本文件,用一组指令来完成镜像的构建.每一条指令构建一层镜像.所有尽量将相同的命令合并成一行以减少中间镜像的层数.
必须
指定基础镜像即我从哪里可以获取到这个镜像,并在它的基础上增加一些功能来实现一个应用,必须是第一个命令
# 公共仓库的镜像
FROM ubuntu:18.04
# 私有harbor仓库镜像
FROM harbor.intra.com/centos:7.9.2009
作者信息,非必须
MAINTAINER qiuqin 13917099322@139.com
# 4. WORKDIR
把某个目录设置为工作目录,和cd命令类似
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
WORKDIR /usr/local/nginx/
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
USER root:root
# 或者
USER 1000:1000
定义构建使用的环境变量.需要先定义才能在构建时进行参数传递,构建完成后失效.
FROM centos:7.9.2009
ARG SOFTWARE
# 或者
ARG SOFTWARE=nginx
RUN yum install -y $SOFTWARE
EXPOSE 80
CMD nginx -g "daemon off;"
# docker build --build-arg SOFTWARE=nginx -t nginx:v0.1 .
FROM centos:7.9.2009
ENV SOFTWARE=nginx
# 或者
ENV SOFTWARE nginx
RUN yum install -y $SOFTWARE
EXPOSE 80
CMD nginx -g "daemon off;"
用于指定持久化目录
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
VOLUME ["/usr/share/nginx/html"]
给镜像添加标签
LABEL KEY1=VALUE1 KEY2=VALUE2 KEY3=VALUE3
指定服务暴露端口
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
EXPOSE 80
或者
EXPOSE 53/tcp 53/udp
将本地文件添加到容器中,不会自动解压文件,也不能访问网络资源
COPY index.html /usr/share/nginx/html/index.html
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
ADD MYDATE.tar /data
ADD http://192.168.31.24/index.html /usr/share/nginx/html/index.html
构建镜像时执行的命令
RUN ["ls","-lh","/etc"]
RUN ["ls -lh /etc"]
RUN ls -l /etc
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:
docker build --no-cache
构建镜像后调用,也就是在容器启动时才进行调用。
CMD ["nginx","-g","daemon off;"]
CMD nginx -g "daemon off;"
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
配置容器,使其可执行化。
ENTRYPOINT ["ls", "/usr/local"]
CMD ["/usr/local/tomcat"]
示例
root@ks-master:~/scratch# cat Dockerfile FROM alpine:latest ENTRYPOINT ["ls","-ld","/etc"] CMD ["/usr/local","/tmp"] root@ks-master:~/scratch# docker build -t test:v1 . Sending build context to Docker daemon 7.35MB Step 1/3 : FROM alpine:latest ---> 9ed4aefc74f6 Step 2/3 : ENTRYPOINT ["ls","-ld","/etc"] ---> Running in c4a4dc4ba7ac Removing intermediate container c4a4dc4ba7ac ---> 7d915bbec6bc Step 3/3 : CMD ["/usr/local","/tmp"] ---> Running in b13a9f25efd8 Removing intermediate container b13a9f25efd8 ---> 17e6b8025f37 Successfully built 17e6b8025f37 Successfully tagged test:v1 root@ks-master:~/scratch# docker run -it --name test1 test:v1 drwxr-xr-x 1 root root 66 May 9 05:06 /etc drwxrwxrwt 2 root root 6 Mar 29 14:45 /tmp drwxr-xr-x 5 root root 41 Mar 29 14:45 /usr/local
用于设置镜像触发器,当当前的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发
ONBUILD RUN rm -rf /usr/share/nginx/html/*
root@ks-master:~/scratch# cat Dockerfile FROM alpine:latest WORKDIR /usr/local/nginx ARG Message="test message" ENV Path=/usr/local/nginx File=aaa.txt USER root RUN echo "$Message" > $Path/$File ENTRYPOINT ["cat"] CMD ["/usr/local/nginx/aaa.txt"] ## 不带参数使用默认的ARG值进行填充 # docker build -t test:v1.08 . # docker run -it --rm --name test2 test:v1.08 test message ## 带参数,使用自定义传入参数进行填充 # docker build --build-arg Message=qiuqin -t test:v1.09 . # docker run -it --rm --name test2 test:v1.09 qiuqin
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。