0%

《Docker容器》Dockerfile语法

前言

Dockerfile文件是用来构建docker镜像的脚本文件

下面是构建镜像的基本命令

1
docker build -t pefish/test:v0.0.1 . // 默认使用当前目录下的Dockerfile文件,也可以通过--file指定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
26
27
28
29
30
31
32
33
* FROM ubuntu                       # 基础镜像。from * as builder可以让指定的镜像作为临时的构建环境,COPY等命令可以通过 --from=builder 来操作构建环境中的文件

* MAINTAINER pefish # 指定维护者信息

* RUN npm install # 在当前镜像基础上执行指令,并返回新的镜像

* CMD ["npm","start","test"] # exec模式,会执行`npm start test`。指定镜像启动后执行的命令,只能有一条,最后一个生效

* CMD npm start test # shell模式。会执行`/bin/sh -c npm start test`

* EXPOSE 80 8080 # 告诉Docker服务端此容器需要暴露的所有端口号

* ENV PORT 80 # 指定容器运行时的环境变量

* ADD <src> <dest> # 将复制指定的目录到容器中的dest目录下。ADD还支持url,比如`ADD http://foo.com/bar.go /tmp/main.go`,还可以自动解压缩,比如`ADD /foo.tar.gz /tmp/`

* COPY <src> <dest> # 将指定的目录复制为容器中的dest目录,`COPY /app/lib/ /app/`, 复制/app/lib目录下的文件或文件夹到/app目录下。相对ADD,尽量使用COPY,当需要自动解压缩时才使用ADD

* ENTRYPOINT ["npm","start","test"] # exec模式。指定镜像启动后执行的命令,只能有一条,cmd命令紧跟其后,`docker run testimage --bind 0.0.0.0`会执行npm start test --bind 0.0.0.0

* ENTRYPOINT npm start test # shell模式。`docker run testimage echo test`会执行`/bin/sh -c npm start test`,cmd命令将被忽略

* SHELL ["/bin/bash", "-c"] # 指定shell模式下的执行器

* VOLUME ["/data"] # 创建一个数据卷,用来存放需要分享出去的数据

* USER pefish # 指定运行容器的用户名,默认是以root执行

* WORKDIR /app # 指定容器的工作目录

* ONBUILD ADD . /app # 当此镜像被作为其他镜像的基础镜像时,会执行这里

* ARG seedSecret=test # build参数,build是通过--build-arg传递进来

案例

下面是一个基于ubuntu镜像构建的一个ts-node镜像,可以用来直接运行ts代码

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
29
30
31
32
33
FROM ubuntu:16.04

RUN apt-get update && apt-get install -y curl

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -

RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get install apt-transport-https -y

RUN apt-get update && apt-get install yarn -y

RUN apt-get install -y screen

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -

RUN apt-get install -y nodejs

RUN yarn global add n

# RUN n -V

RUN n 12.13.0

RUN yarn global add ts-node

RUN apt-get install -y vim

CMD ["sleep", "infinity"]

# docker build -t pefish/ts-node:v0.0.1 .
# docker push pefish/ts-node:v0.0.1
# docker run -d --name ts-node pefish/ts-node:v0.0.1

注意点

  • /etc/hosts不允许修改,docker run时指定参数完成域名到ip的映射
  • 每个RUN运行在独立的shell中,对.bashrc的修改得不到保持
  • ENV PATH "$PATH:$HOME/bin" 这里的$HOME会被识别成空字符串,目前还未被官方修复



微信关注我,及时接收最新技术文章