Docker教程 Dockerfile 标签介绍

docker commit 也可以用来构建镜像,但是并不推荐。相反,更推荐使用dockerfile与docker build命令来构建镜像,Dockerfile使用基本的基于DSL(Domain Specific Language)语法的指令来构建Docker镜像。Dockerfile构建镜像更具备可重复性、透明性以及幂等性。

指令介绍

FROM
MAINTAINER

介绍镜像作者

MAINTAINER Sajor "[email protected]"

RUN

每条RUN指令都会创建一个新的镜像层,如果该指令执行成功,就会将此镜像层提交,之后继续执行Dockerfile中的下一条指令。

默认情况下RUN指令会在shell里使用命令包装器 /bin/sh -c 来执行。如果是不支持shell的平台也可以使用exec格式的RUN指令

# 默认
RUN apt-get update && apt-get install -y nginx
# exec格式
RUN ["apt-get", "install", "-y", "nginx"]
CMD

类似RUN,RUN指令是指定镜像被构建时要运行的命令,而CMD是指定容器被启动时要运行的命令。和docker run命令类似,该指令会被docker run命令覆盖,多条CMD指令也只会执行最后一条。

# 和RUN指令一样,推荐用数组方式
CMD ["/bin/bash"]

# 会被此命令中的/bin/ps覆盖
docker run -it sajor/test /bin/ps 
ENTRYPOINT

与CMD指令也很类似。因为CMD指令会被docker run命令覆盖,但此命令不会,而且docker run命令中指定的任何参数都会被当作参数再次传递给ENTRYPOINT指令中指定的命令。

ENTRYPOINT ["/usr/sbin/nginx"] 
# 可和ENTRYPOINT命令结合
docker run  -it sajor/test -g "daemon off;"

也可以和CMD命令结合使用

ENTRYPOINT ["/usr/sbin/nginx"] 
CMD ["-h"]
# 可和ENTRYPOINT命令结合,若不指定参数则默认-h,指定则后台启动
docker run  -it sajor/test -g "daemon off;"
WORKDIR

设置工作目录

ENV

设置环境变量

ENV TARGET_DIR /opt/app SOURCE_DIR /opt/soft
WORKDIR $TARGET_DIR

进入容器后,输入env命令,也可查看所有环境变量

USER

指定用户名或UID,以及组或GID,或两者任意组合

USER user
USER user:group 
USER uid:gid
VOLUME

指定数据卷,可以让我们将数据如源代码、数据库或者其他内容添加到镜像中,而不是提交到镜像中。并且允许我们在多个容器间共享这些内容。

  • 卷可以在容器间共享和重用
  • 对卷的修改是立即生效的
  • 对卷的修改不会对更新镜像产生影响
  • 卷会一直存在直到没有任何容器再使用它
# 基于此镜像创建的任何容器创建一个名为 /data 的挂载点
VOLUME ["/data"]
# 多个卷
VOLUME ["/opt/project", "/data"]
ADD

用于将构建环境下的文件和目录复制到镜像中

# 源文件位置和目标文件位置
ADD software.lic /opt/application/software.lic

# 源也可以是个URL,或构建上下文或者环境中文件名或目录
ADD http://wordpress.org/latest.zip /root/wordpress.zip

# 源为压缩文件,会自动解压,如果已存在同名文件则不覆盖
ADD latest.tar.gz /var/www/wordpress/

如果目标路径不存在,则会自动创建 权限默认为755,且UID与GID都为0。

注意:ADD指令会使构建缓存失效。

COPY

和ADD类似,单不做文件提取(extraction)和解压(decompression)的工作。

不能复制Dockerfile以外的文件。(因为构建环境是上传到docker守护进程中,复制是在docker守护进程中执行,任何位于构建环境以外的东西是不可用的)

# COPY指令的目的位置必须是容器内部的一个绝对路径。
COPY conf.d/ /etc/apache2/
LABEL

用于为Docker镜像添加元数据。元数据以键值对形式展现。

防止不同的元数据指令创建过多镜像层,建议将所有元数据都放入一行。可通过 docker inspect 来查看label信息。

LABEL version="1.0" type="Data Center" role="Web Server"
ARG

ARG指令用于定义 docker build 命令运行时传递的变量。

ARG var
ARG webapp_user=user

和此命令搭配使用 docker build --build-arg var=1234 -t sajor/webapp . var值设置为1234。而webapp_user仍为默认的user。

只有预先在Dockerfile中定义后,才可以使用docker build命令指定,Docker预定义了一组ARG变量,可以在构建时直接使用。而不必再到Dockerfile中定义。 预定义ARG变量

# 预定义ARG变量
HTTP_PROXY
HTTPS_PROXY
FTP_PROXY
NO_PROXY
ALL_PROXY
http_proxy
https_proxy
ftp_proxy
no_proxy
all_proxy

切记不要使用ARG来传递证书或密钥之类的机密数据。在构建过程中或构建历史中会被暴露。

ONBUILD

该指令可为镜像添加触发器,当一个镜像被用作其他镜像的基础镜像时,该镜像中的触发器被执行。

ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make 

可通过inspect命令查看。OnBuild。

ONBUILD一般在子镜像的FROM后执行,只会触发子镜像,孙子镜像不会触发。

FROM、MAINTAINER和ONBUILD不能用于ONBUILD

EXPOSE

端口暴露。

EXPOSE 80
STOPSIGNAL

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


构建

  • docker build -t="" [email protected]:xxx/xxx -f /path/to/dockerfile #构建镜像
    • --no-cache 略过缓存功能
    • -f 文件名称可以不是dockerfile,-f可指定Dockerfile路径
    • --build-arg # 给ARG传递参数使用
  • docker history xxxx #查看镜像构建层
    可以直接从Git仓库中

安全测评root权限 Dockerfile Misconfiguration: Default User Privilege

RUN pip install flask && \
    groupadd -r flask && useradd -r -g flask flask && \
    mkdir /src && \
    chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

alpine 中命令不一样 How do I add a user when I'm using Alpine as a base image?

# 使用非root账户启动
RUN addgroup -S dispatch && adduser -S dispatch -G dispatch && \
    mkdir /app && \
    chown -R dispatch:dispatch /app && \
    echo "Asia/shanghai" > /etc/timezone \
    
USER dispatch

WORKDIR /app

Dockerfile 技巧——尽量使用非root用户

Dockerfile的最佳实践

你可能感兴趣的:(Docker)