Dockerfile是包含一些Linux命令的、名为Dockerfile的文件。Docker通过读取该文件中的命令来组建镜像。Dockerfile一般分为“基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令”等四部分(注释符号为“#”)。
- # 运行Dockerfile ("."代表当前目录)
- docker build -t image_name:tag_name .
-
- # 通过-f 指定Dockerfile文件位置
- docker build -f /path/Dockerfile .
Docker的images是由一层层的layer组成的,然后通过联合挂载的方式挂载成一个文件系统。如果更改了某一层的信息,那么从这层之后所有的层都需要重新build。
分别使用不同基础镜像(centos、ubuntu)构建指定镜像。
- FROM registry.cn-hangzhou.aliyuncs.com/xwjs/centos7
- MAINTAINER kk
-
- RUN yum -y update &&\
- yum install -y pcre pcre-devel zlib openssl openssl-devel &&\
- yum clean all
-
- ARG NGINX_VERSION=1.15.0
-
- # Nginx
- WORKDIR /tmp
-
- RUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz &&\
- tar zxf nginx-${NGINX_VERSION}.tar.gz &&\
- cd /tmp/nginx-${NGINX_VERSION}.tar.gz &&\
- ./configure \
- --prefix=/usr/local/nginx \
- --with-http_ssl_module \
- --with-http_sub_module \
- --with-http_dav_module \
- --with-http_flv_module \
- --with-http_gzip_static_module \
- --with-http_stub_status_module \
- --with-debug && \
- make && \
- make install
-
- # 设置环境变量
- ENV PATH /usr/local/nginx/sbin:$PATH
-
- # 开放端口
- EXPOSE 80 443
-
- # 执行命令
- ENTRYPOINT ["nginx", "-g", "daemon off;"]
Dockerfile 文件
1: 构建镜像时位置为打包代码的根目录;
2: 镜像末尾需附上服务启动命令CMD**。
- FROM ubuntu:18.04
- ENV DEBIAN_FRONTEND noninteractive
- RUN apt-get update && \
- apt-get install -y --no-install-recommends apt-utils && \
- apt-get install -y --no-install-recommends python3.8 python3-pip && \
- ln -sv /usr/bin/python3.8 /usr/bin/python && \
- ln -sv /usr/bin/pip3 /usr/bin/pip
-
- RUN apt-get install -y curl wget mysql-client inetutils-ping
-
- RUN apt install -y nginx vim procps xinetd telnetd telnet && \
- apt install -y net-tools lsof strace
-
- RUN python3 -m pip install uwsgi DBUtils==1.2 drf-yasg2 dj-rest-auth django-filter django-rest-swagger django djangorestframework pymysql django-import-export django-cors-headers
-
- RUN pip3 install MarkupSafe pandas threadpool
- # RUN pip3 install --no-cache-dir numpy Cython onnxruntime pymilvus -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
- # RUN pip3 install -U insightface==0.6.2 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
-
- RUN rm -rf /tmp/ && \
- rm -rf /var/lib/apt/lists/*
-
- # ---------需要在docker内自动启动程序时使用-----------------
- COPY . /fingerprint
- WORKDIR /fingerprint
- -------- 测试环境变量声明---------
- # CMD ["export", "ENV=test"]
- ENV ENV=test
- -----------END------------------
-
- # CMD ["python3", "-m", "http.server", "8080"] # 调试用,进入后(执行下条命令)手动启动服务
- CMD ["python3", "./fingerprint/api/manage.py", "runserver", "0.0.0.0:8099"]
制作镜像
- docker build -t fingerprint:1.0 .
- docker save fingerprint:1.0 > dkfile.tar.gz
- RUN ["/bin/executable", "param1", "param2"]
- # RUN yum install nginx
- ENV name=kk
- ENV name qwe asd (qwe,asd均为value)
如果想在运行期间使用某些变量,那么ENV是唯一的选择。ENV主要是定义环境变量,在docker run的时候ENV的配置会加载到容易内部,但ARG的参数在内部是没法看到的。
可以通过下面命令更改ENV的默认值:
docker run -e var=yyy
- ARG site
- ARG build_user=www
ARG主要是定义一个变量,在使用docker build时可以通过参数来设定。
docker build --build-arg =
因此如果需要在build期间使用某些变量,ARG是最好的选择。
即在容器启动时才进行调用。
CMD 用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的指令。
- CMD ["executable", "param1", "param2"] (执行可执行文件,优先)
- CMD ["param1", "param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
- CMD command param1 param2 (执行shell内部命令)
- eg:
- CMD echo "This is a test." | wc -
- CMD ["/usr/bin/wc", "--help"]
配合CMD可省去“application”,只使用参数。
- ENTRYPOINT ["executable", "param1", "param2"] (可执行文件,优先)
- ENTRYPOINT command param1 param2 (shell内部命令)
- eg:
- FROM ubuntu
- ENTRYPOINT ["top", "-b"]
- CMD ["-c"]
ENTRYPOINT与CMD非常类似,不同的是通过docker run 执行的命令不会覆盖ENTRYPOINT,而docker run 命令中指定的任何参数,都会被当作参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
docker run -itd --name=nginx nginx echo 'hello word'
类似cd命令
WORKDIR /usr/local/ (当前的工作目录)
在使用docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。
必须为第一个命令。
- FROM
- FROM
: (tag表示版本) - FROM
@ - eg:
- FROM centos:7.0
MAINTAINER Tom
tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。
- ADD
... - # 添加所有以“tes”开头的文件
- ADD test* /mydir/
- # "?"代表任一字符
- ADD tes?.txt /mydir/
- # 添加“test”到相对目录(第一个参数时宿主机文件路径,第二个参数时容器路径)
- ADD test relativeDir
但不会自动解压文件,也不能访问网络资源。
EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run 运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
- EXPOSE 80 443
- EXPOSE 8080
- VOLUME ["/data"]
- VOLUME ["/var/www", "var/log/apache2", "/etc/apache2"]
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1. 卷可以在容器间共享和重用;
2. 容器并不一定要和其他容器共享卷;
3. 修改卷后会立即生效;
4. 对卷的修改不会对镜像产生影响;
5. 卷会一直存在,直到没有任何容器在使用它。
- LABEL: 用于为镜像添加元数据
- LABEL version="1.0" description="这是一个nginx镜像"
-
- USER: 指定运行容器时的用户名或UID
- USER user
- USER user:group
- USER uid:gid
-
- ONBUILD: 用于设置镜像触发器
- ONBUILD ADD . /app/src
- ONBUILD RUN /usr/local/bin/python-build --dir /app/src
- 当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发。