Dockerfile

ARG 构建参数

ARG <参数名>[=<默认值>]

该默认值可以在构建命令 docker build 中用 –build-arg <参数名>=<值> 来覆盖。

ARG LARADOCK_PHP_VERSION
ARG BASE_IMAGE_TAG_PREFIX=latest
FROM laradock/workspace:${BASE_IMAGE_TAG_PREFIX}-${LARADOCK_PHP_VERSION}

LABEL maintainer="Mahmoud Zalt <mahmoud@zalt.me>"

# ARG 指令有生效范围,如果在 FROM 指令之前指定,那么只能用于 FROM 指令中。
# 在 FROM 之后须再次指定 ARG
ARG LARADOCK_PHP_VERSION

COPY vs. ADD

能用 COPY 就用 COPY,只有在 ADD 独有功能确实需要时才使用 ADD。

只有在确实需要 ADD 的额外功能(自动解压本地归档文件、从远程 URL 获取资源)时才使用 ADD。

RUN vs. CMD vs. ENTRYPOINT

RUN 在 镜像构建时执行 并生成新层;CMD/ENTRYPOINT 在 容器启动时执行。

  • RUN 安装依赖、编译源码。
  • ENTRYPOINT 用来定义 始终要执行 的主命令。
  • CMD 用来提供 默认参数,也可在缺少 ENTRYPOINT 时充当默认命令。
...

ENTRYPOINT [ "/scripts/app/entrypoint.sh" ]
CMD "/scripts/fpm/start-php-fpm.sh"
  • ENTRYPOINT 以 exec 形式 (JSON 数组) 指定:容器启动时一定会先执行 /scripts/app/entrypoint.sh,它就是 PID 1。可被 docker run 的 –entrypoint 覆盖。
  • CMD 以 shell 形式 (单字符串) 指定默认命令:缺省情况下,Docker 会把它当作 /bin/sh -c "/scripts/fpm/start-php-fpm.sh" 并把这一整串 作为参数 传给 ENTRYPOINT。可被 docker run 后面参数覆盖。
/scripts/app/entrypoint.sh /bin/sh -c "/scripts/fpm/start-php-fpm.sh"

LABEL vs. ARG vs. ENV

LABEL 写入镜像 元数据。ARG 仅在 构建阶段 可用;ENV 在 构建后续层运行时 都可用,并会出现在最终镜像中。

  • 用 LABEL 记录作者、版本、VCS 地址等信息。
  • 用 ARG 传版本号、密钥等只在构建时需要的值。
  • 用 ENV 传配置、端口等运行期仍需的变量。

Config Setting

{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://reg-mirror.qiniu.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}