Docker Dockerfile使用详解(1)

简介: Docker Dockerfile使用详解(1)

Docker Dockerfile 编排

文章目录

Docker Dockerfile 编排

1. FROM

2. COPY

3. ADD

4. RUN

5. CMD

6. ENTRYPOINT

7. LABEL

8. EXPOSE

9. ENV

10. VOLUME

11. USER

12. WORKDIR

13. ARG

14. ONBUILD

15. STOPSIGNAL

16. SHELL

1. FROM

FROM指令用于指定其后构建新镜像所使用的基础镜像。

FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>

FROM必须是Dockerfile中第一条非注释命令

在一个Dockerfile文件中创建多个镜像时,docker17.05版本以后,FROM可以多次出现。只需在每个新命令FROM之前,记录提交上次的镜像ID。

tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像

多次使用FROM的情况时构建与运行分离的场景

基础镜像golang:1.10.3是非常庞大的,因为其中包含了所有的Go语言编译工具和库,而运行时候我们仅仅需要编译后的server程序

就行了,不需要编译时的编译工具,最后生成的大体积镜像就是一种浪费。


scratch 是内置关键词,并不是一个真实存在的镜像。 FROM scratch 会使用一个完全干净的文件系统,不包含任何文件。因为Go语言编译后不需要运行时,也就不需要安装任何的运行库。FROM scratch可以使得最后生成的镜像最小化,其中只包含了server 程序。

当然,你也可以FROM一个你熟悉的并且空间占用小的镜像,比如:centos、ubuntu、busybox等。

# 编译阶段
FROM golang:1.10.3
COPY server.go /build/
WORKDIR /build
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOARM=6 go build -ldflags '-w -s' -o server
# 运行阶段
FROM scratch
# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=0 /build/server /
ENTRYPOINT ["/server"]

COPY 指令的--from=0 参数,从前边的阶段中拷贝文件到当前阶段中,多个FROM语句时,0代表第一个阶段。除了使用数字,我们还可以给阶段命名,比如:

# 编译阶段 命名为 builder
FROM golang:1.10.3 as builder
# ... 省略
# 运行阶段
FROM scratch
# 从编译阶段的中拷贝编译结果到当前镜像中
COPY --from=builder /build/server /

COPY --from 不但可以从前置阶段中拷贝,还可以直接从一个已经存在的镜像中拷贝。比如,

FROM ubuntu:16.04
COPY --from=quay.io/coreos/etcd:v3.3.9 /usr/local/bin/etcd /usr/local/bin/

2. COPY

COPY同样用于复制构建环境中的文件或目录到镜像中。

COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
COPY --from=builder /build/server /
COPY --from=quay.io/coreos/etcd:v3.3.9 /usr/local/bin/etcd /usr/local/bin/

COPY指令非常类似于ADD,不同点在于COPY只会复制构建目录下的文件,不能使用URL也不会进行解压操作。

3. ADD

ADD用于复制构建环境中的文件或目录到镜像中。

ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
  • <src>指定源文件位置,<dest>来指定目标位置。
  • <src>可以是一个构建上下文中的文件或目录,也可以是一个URL,但不能访问构建上下文之外的文件或目录。

ADD复制一个网络文件:

ADD http://wordpress.org/test.zip $WORKER_PATH

另外,如果使用的是本地归档文件(gzip、bzip2、xz)时,Docker会自动进行解包操作,类似使用tar -x

4. RUN

RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:

shell执行

在这种方式会在shell中执行命令,Linux下默认使用/bin/sh -c,Windows下使用cmd /S /C

注意:通过SHELL命令修改RUN所使用的默认shell

RUN <command>
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'                          #通过RUN执行多条命令时,可以通过\换行执行
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'  #同一行中,通过分号分隔命令

exec执行

RUN ["executable", "param1", "param2"]

RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache

5. CMD

CMD用于指定在容器启动时所要执行的命令。CMD有以下三种格式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。

CMD与RUN在功能实现上也有相似之处。如:

docker run -t -i ghostwritten/web_server /bin/true

等价于:

cmd ["/bin/true"]
  • CMD在Dockerfile文件中仅可指定一次,指定多次时,会覆盖前的指令。
  • docker run命令也会覆盖Dockerfile中CMD命令。

6. ENTRYPOINT

ENTRYPOINT用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过ENTRYPOINT指定的程序都会被设置为默认程序。ENTRYPOINT有以下两种形式:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖

ENTRYPOINT

docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。

Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

docker run运行容器时指定的参数都会被传递给ENTRYPOINT,且会覆盖CMD命令指定的参数。如,执行docker run <image> -d时,-d参数将被传递给入口点。

也可以通过docker run --entrypoint重写ENTRYPOINT入口点。

示例:

ENTRYPOINT ["/usr/bin/nginx"]

Dockerfile

FROM ubuntu:16.04
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hello World, 我是个容器' > /var/www/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]

构建

docker build -t="ghostwritten/app" .

创建容器

docker run -i -t  ghostwritten/app -g "daemon off;"

-g "daemon off;"参数将会被传递给ENTRYPOINT,最终在容器中执行的命令为/usr/sbin/nginx -g "daemon off;"

7. LABEL

LABEL用于为镜像添加元数据,元数以键值对的形式指定:

LABEL <key>=<value> <key>=<value> <key>=<value> ...

使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。

LABEL version="1.0" description="这是一个Web服务器" by="ghostwritten"

也可以换行

LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

docker inspect查看:

$ docker inspect itbilu/test
"Labels": {
    "version": "1.0",
    "description": "这是一个Web服务器",
    "by": "ghostwritten"
},

注意:Dockerfile中还有个MAINTAINER命令,该命令用于指定镜像作者。但MAINTAINER并不推荐使用,更推荐使用LABEL来指定镜像作者。如:

LABEL maintainer="ghostwritten"

8. EXPOSE

EXPOSE用于指定容器在运行时监听的端口:

EXPOSE <port> [<port>...]



相关文章
|
6天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
137 6
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
6天前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
31 3
|
22天前
|
Docker 容器
docker中使用Dockerfile自动创建数据卷
【10月更文挑战第12天】
15 5
|
1月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
34 4
|
2月前
|
应用服务中间件 nginx Docker
Docker镜像-基于DockerFile制作编译版nginx镜像
这篇文章介绍了如何基于Dockerfile制作一个编译版的nginx镜像,并提供了详细的步骤和命令。
387 17
Docker镜像-基于DockerFile制作编译版nginx镜像
|
2月前
|
应用服务中间件 Linux nginx
Docker镜像-基于DockerFile制作yum版nginx镜像
本文介绍了如何使用Dockerfile制作一个基于CentOS 7.6.1810的yum版nginx镜像,并提供了详细的步骤和命令。
128 20
|
2月前
|
Docker 容器
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
7-13|docker build -t image-name:tag path/to/Dockerfile 这个命令具体什么意思
|
3月前
|
Docker 容器
在Docker中,Dockerfile有哪些常见指令?
在Docker中,Dockerfile有哪些常见指令?
|
3月前
|
缓存 Docker 容器
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
|
3月前
|
缓存 开发者 Docker
Dockerfile是Docker容器化过程中的核心组件,它允许开发者以一种可重复、可移植的方式自动化地构建Docker镜像
【8月更文挑战第19天】Dockerfile是构建Docker镜像的脚本文件,含一系列指令定义镜像构建步骤。每条大写指令后跟至少一个参数,按序执行,每执行一条指令即生成新的镜像层。常用指令包括:FROM指定基础镜像;RUN执行构建命令;EXPOSE开放端口;CMD指定容器启动行为等。优化策略涉及减少镜像层数、选择轻量基础镜像、利用缓存及清理冗余文件。示例:基于Python应用的Dockerfile包括设置工作目录、复制文件、安装依赖等步骤。掌握Dockerfile有助于高效自动化构建镜像,加速应用部署。
34 1
下一篇
无影云桌面