Docker Dockerfile 文件编写

Dockerfile 是用于制作镜像,相当把你需要在容器里安装的关联依赖的命令提取出来做成脚本。文件中是以相关的指令来进行设置,下面就来说说常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 基于那个镜像
FROM 镜像[:标签]
# 镜像维护者联系方式
MAINTAINER 称呼 邮箱
# 镜像里执行的命令
RUN 命令
# 上传文件到容器,如果是压缩包会进行解压(windwos 系统下无效)
ADD
# 复制文件/文件夹到容器指定目录
COPY
# 环境变量,常用于软件安装版本调整
ENV
# 进入容器的初始目录
WORKDIR
# 数据卷映射路径
VOLUME
# 保留端口
EXPOSE
# 容器启动执行的命令,只有最后一个生成,会被替代
CMD
# 容器启动执行的命令,追加模式
ENTRYPOINT

# 当构建一个被继承 Dockerfile 会运行的指令。
ONBUILD

上面为常用的指令,如果想了解更多可以去 官方文档 查找。

小技巧:

1、使用 alpine 系统标识的镜像为基础,它很小,只有4M

2、RUN 命令不一定能成功执行,不必一遍遍调整然后绑定,可以先生成目标镜像的容器,然后以命令行的方式进入,执行需要的命令,无误后再写入 Dockerfile。

3、文件里每个指令都是一个 commit,简单的来说就是执行的命令成功后,后面再执行其他 Dockerfile 一样的内容将会复用,不会再重新执行。所以应该以一组操作为单位执行,不要一次性全部执行完,也不要一条条命令拆太散(有上限)

常用操作

1
2
3
4
# 让 alpine 的 apk 安装命令使用中国源
RUN echo http://mirrors.aliyun.com/alpine/v3.10/main > /etc/apk/repositories \
&& echo http://mirrors.aliyun.com/alpine/v3.10/community >> /etc/apk/repositories \
&& apk update && apk upgrade
1
2
3
4
# 使用 composer 镜像文件,并设置国内镜像
COPY --from=composer:2.1.12 /usr/bin/composer /usr/local/bin/composer
RUN chmod +x /usr/local/bin/composer \
&& /usr/local/bin/composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
1
2
3
4
5
6
7
8
9
# 设置时区
ARG timezone
ENV TIMEZONE=${timezone:-"Asia/Shanghai"}
RUN apk add --no-cache tzdata \
&& cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone \
&& echo -e "[Date]\ndate.timezone=${TIMEZONE}" > /usr/local/etc/php/conf.d/timezone.ini

# Todo: 未实验使用变量会不会导致 commit 失效,如非必要还是填写固定内容
1
2
3
4
# 编译安装的依赖,为减小大小,需要处理完再卸载
RUN apk add m4 autoconf make gcc g++ linux-headers
# ...需要编译的操作
RUN apk del m4 autoconf make gcc g++ linux-headers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 综合实战: 设置 npm、yarn 安装包保存路径,换中国源,并添加环境变量
# 生成镜像命令: docker build -t local/node:16-alpine3.12 .
# 启动命令:docker run -t -d --name node-study local/node:16-alpine3.12 /bin/sh
# 启动参数解释:-t 和 /bin/sh 是重点,因为 tty=true 和 /bin/sh 相当于给容器开了一个新进程,让其不会自动关闭
FROM node:16-alpine3.12

MAINTAINER jani <liberty_linlin@qq.com>

RUN npm config set prefix /usr/local/nodejs/global \
&& npm config set cache /usr/local/nodejs/cache \
&& npm config set registry=http://registry.npm.taobao.org

RUN yarn config set global-folder /usr/local/yarn/global \
&& yarn config set cache-folder /usr/local/yarn/cache \
&& yarn config set prefix /usr/local/yarn/global \
&& yarn config set registry https://registry.npm.taobao.org \
&& yarn config set sass_binary_site "https://npm.taobao.org/mirrors/node-sass/" \
&& yarn config set phantomjs_cdnurl "http://cnpmjs.org/downloads" \
&& yarn config set electron_mirror "https://npm.taobao.org/mirrors/electron/" \
&& yarn config set sqlite3_binary_host_mirror "https://foxgis.oss-cn-shanghai.aliyuncs.com/" \
&& yarn config set profiler_binary_host_mirror "https://npm.taobao.org/mirrors/node-inspector/" \
&& yarn config set chromedriver_cdnurl "https://cdn.npm.taobao.org/dist/chromedriver"

ENV PATH $PATH:/usr/local/nodejs/global/bin:/usr/local/yarn/global/bin

VOLUME /usr/local/nodejs/global /usr/local/nodejs/cache /usr/local/yarn/global /usr/local/yarn/cache

CMD ["/bin/sh"]

操作命令

可以对远程的镜像进一步的调整,比如使用 ubuntu 镜像,运行时它的时区并不是在中国这边,有一些必要的依赖默认没有安装等等,可以使用 RUN 来运行命令、 COPY 来复制文件。

docker build -t local/ubuntu:18.20 -f xxx.dockerfile ./ 加载到镜像库中,-f xxx.dockerfile 是配置文件,如果不是默认的 Dockerfile 命令就得设置。

1
docker run -dp 8080:80 --name ubuntu-shell local/ubuntu:18.20 /bin/bash

解析:

  • -dp: -d -p 的合并参数
  • 8080:80: 8080 当前访问端口,80容器端口
  • –name ubuntu-shell: 给实例添加名字
  • local/ubuntu:18.20: 镜像名:版本号

使用容器中的命令处理指定文件的项目

1
docker run --rm -itv ../project/swoft:/app php:7.4.24 /bin/bash
  • –rm: 退出命令时删除
  • -itv: -i -t -v 结合
  • docker_php: 镜像名,可以加 :version 来指定版本
  • /bin/bash: 在容器中执行的命令,注:容器都会指定工作目录,如果不确定当前目录,进入容器再切换到自己绑定的目录中