Dockerfile详解

本文详细介绍了Dockerfile的使用方法及各关键字的功能,包括如何基于基础镜像进行定制,安装软件,设置维护者信息,指定容器启动命令等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker Dockerfile详解

标签: docker
155893人阅读 评论(2) 收藏 举报
分类:

如何使用

Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。当前目录下包含Dockerfile,使用命令build来创建新的image,并命名为edwardsbean/centos6-jdk1.7:

docker  build -t edwardsbean/centos6-jdk1.7  .

Dockerfile关键字

如何编写一个Dockerfile,格式如下:

# CommentINSTRUCTION arguments
FROM

基于哪个镜像

RUN

安装软件用

MAINTAINER

镜像创建者

CMD

Container启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.

CMD主要用于container时启动指定的服务,当Docker run command的命令匹配到CMD command时,会替换CMD执行的命令。如:
Dockerfile:

CMD echo hello world

运行一下试试:

edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd
hello world

一旦命令匹配:

edwardsbean@ed-pc:~/software/docker-image/centos-add-test$ docker run centos-cmd echo hello edwardsbean
hello edwardsbean
ENTRYPOINT

container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条

ENTRYPOINT没有CMD的可替换特性

USER

使用哪个用户跑container
如:

ENTRYPOINT ["memcached"]
USER daemon
EXPOSE

container内部服务开启的端口。主机上要用还得在启动container时,做host-container的端口映射:

docker run -d -p 127.0.0.1:33301:22 centos6-ssh

container ssh服务的22端口被映射到主机的33301端口

ENV

用来设置环境变量,比如:

ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ADD

将文件<src>拷贝到container的文件系统对应的路径<dest>
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0
如果文件是可识别的压缩格式,则docker会帮忙解压缩

  • 如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下

  • 如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如:

    docker build github.com/creack/docker-firefox
    

    docker-firefox目录下必须有Dockerfile和要ADD的文件

注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD url file.

ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

VOLUME

可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR

切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效

ONBUILD

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
详见here


3
7
 
 
Dockerfile 是用于构建 Docker 镜像的文本文件,其中包含了按顺序执行的一系列指令。每个指令都会在镜像中创建一个新的层,这使得 Docker 镜像具有分层的结构,可以高效地利用存储空间并加快构建速度[^1]。 ### Dockerfile 的基本结构 Dockerfile 通常由以下几个部分组成: - **基础镜像信息**:使用 `FROM` 指令指定。 - **维护者信息**:可选,使用 `LABEL` 或 `MAINTAINER` 指令指定。 - **镜像操作指令**:如 `RUN`、`COPY`、`ADD` 等,用于对镜像进行操作。 - **容器启动命令**:如 `CMD`、`ENTRYPOINT`,用于指定容器启动时运行的命令。 - **其他配置指令**:如 `WORKDIR`、`ENV`、`EXPOSE`、`VOLUME` 等,用于设置容器的工作环境。 ### Dockerfile 指令详解 #### `FROM` `FROM` 指令用于指定基础镜像,这是 Dockerfile 的第一条指令,并且每个 Dockerfile 至少要有一个 `FROM` 指令。可以指定标签来选择特定版本的基础镜像,也可以使用 `AS` 关键字为构建阶段命名,常用于多阶段构建[^3]。 ```dockerfile FROM ubuntu:20.04 ``` #### `ARG` `ARG` 指令用于定义构建时的变量,可以在构建镜像时通过 `--build-arg` 参数传递值。这些变量可以在 Dockerfile 中被 `RUN` 指令等引用[^2]。 ```dockerfile ARG VERSION=1.0 RUN echo "Version: $VERSION" ``` #### `ENV` `ENV` 指令用于设置环境变量,这些变量在构建过程中以及容器运行时都可用。环境变量可以通过 `$VAR` 的形式在 Dockerfile 中引用。 ```dockerfile ENV MY_PATH /usr/local/myapp WORKDIR $MY_PATH ``` #### `COPY` `COPY` 指令用于将本地文件系统中的文件或目录复制到镜像中的指定路径。支持从构建阶段复制文件(多阶段构建)[^3]。 ```dockerfile COPY . /app ``` #### `WORKDIR` `WORKDIR` 指令用于设置工作目录。后续的 `RUN`、`CMD`、`ENTRYPOINT` 等指令都会在这个目录下执行。如果目录不存在,会被自动创建[^4]。 ```dockerfile WORKDIR /app ``` #### `RUN` `RUN` 指令用于在镜像构建过程中执行命令。这些命令通常用于安装软件包或编译代码[^1]。 ```dockerfile RUN apt-get update && apt-get install -y nginx ``` #### `CMD` `CMD` 指令用于指定容器启动时默认执行的命令。如果有多个 `CMD` 指令,只有最后一个会生效。`CMD` 提供的默认参数可以在运行容器时被覆盖。 ```dockerfile CMD ["nginx", "-g", "daemon off;"] ``` #### `ENTRYPOINT` `ENTRYPOINT` 指令用于配置容器启动时运行的可执行文件。与 `CMD` 不同的是,`ENTRYPOINT` 的参数不会被覆盖,而是将 `CMD` 或运行时提供的参数作为其参数。 ```dockerfile ENTRYPOINT ["nginx", "-g"] CMD ["daemon off;"] ``` #### `LABEL` `LABEL` 指令用于为镜像添加元数据,如版本号、描述等信息。这些标签可以通过 `docker inspect` 命令查看[^2]。 ```dockerfile LABEL version="1.0" LABEL description="This is a sample Dockerfile" ``` #### `EXPOSE` `EXPOSE` 指令用于声明容器运行时监听的端口。虽然它不会自动映射端口,但可以作为文档说明,帮助用户了解容器需要暴露哪些端口[^1]。 ```dockerfile EXPOSE 80 ``` #### `VOLUME` `VOLUME` 指令用于创建挂载点,使数据可以在容器之间共享或持久化。即使容器停止或删除,卷中的数据仍然存在[^4]。 ```dockerfile VOLUME ["/data"] ``` #### `USER` `USER` 指令用于指定运行容器时使用的用户。这有助于提高安全性,避免以 root 用户身份运行容器。 ```dockerfile USER myuser ``` #### `ONBUILD` `ONBUILD` 指令用于设置一个触发器,当该镜像被其他镜像作为基础镜像时,这些触发器会在子镜像构建时自动执行。这对于构建依赖于父镜像的子镜像非常有用。 ```dockerfile ONBUILD COPY . /app ONBUILD RUN make /app ``` ### 多阶段构建 多阶段构建允许在一个 Dockerfile 中使用多个 `FROM` 指令,每个 `FROM` 指令定义一个独立的构建阶段。通过这种方式,可以在一个阶段中编译代码,在另一个阶段中仅包含运行所需的文件,从而减少最终镜像的大小。 ```dockerfile # 第一阶段:构建阶段 FROM golang:1.18 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 第二阶段:运行阶段 FROM alpine:latest WORKDIR /app COPY --from=builder /app/myapp . CMD ["./myapp"] ``` ### 最佳实践 - **最小化镜像大小**:尽量使用轻量级的基础镜像(如 Alpine Linux),并清理不必要的文件和缓存。 - **合理使用缓存**:Docker 在构建镜像时会利用缓存来加速构建过程。为了充分利用缓存,应将不经常变化的指令放在前面。 - **安全性和权限管理**:避免以 root 用户身份运行容器,使用 `USER` 指令指定非特权用户。 - **多阶段构建**:利用多阶段构建减少最终镜像的体积,只保留必要的文件和依赖项。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值