学习Docker之Dockerfile的命令

本文详细介绍了Dockerfile中的主要命令,包括FROM、MAINTAINER、RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME、CMD和ENTRYPOINT等,通过实例解析了它们的使用方法和区别。CMD与ENTRYPOINT的区别在于,CMD的命令会被docker run覆盖,而ENTRYPOINT不会,且两者结合时,CMD作为ENTRYPOINT的参数。最后提供了一个简单的Dockerfile示例,帮助读者更好地理解和应用。

积木.png

使用Dockerfile去构建镜像好比堆积木、使用pom去构建maven项目一样,有异曲同工之妙,下面就把Dockerfile中主要的命令介绍一下。

组成部分

部分命令
基础镜像信息FROM
维护者信息MAINTAINER
镜像操作指令RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令CMD、ENTRYPOINT

详情:官方文档

各命令详解

FROM

指定哪种镜像作为新镜像的基础镜像,如:

FROM ubuntu:14.04

MAINTAINER

指明该镜像的作者和其电子邮件,如:

MAINTAINER vector4wang "xxxxxxx@qq.com"

RUN

在新镜像内部执行的命令,比如安装一些软件、配置一些基础环境,可使用\来换行,如:

RUN echo 'hello docker!' \
    > /usr/local/file.txt

也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:

RUN ["apt-get","install","-y","nginx"]

要注意的是,executable是命令,后面的param是参数

COPY

将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

COPY application.yml /etc/springboot/hello-service/src/resources

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
原因:

因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。
—《THE DOCKER BOOK》

ADD

将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:

ADD application.yml /etc/springboot/hello-service/src/resources

但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。

EXPOSE

暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):

EXPOSE 8080 
EXPOSE 8081
...

WORKDIR

在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如

WORKDIR /usr/local
WORKDIR webservice
RUN echo 'hello docker' > text.txt
...

最终会在/usr/local/webservice/目录下生成text.txt文件

ONBUILD

当一个包含ONBUILD命令的镜像被用作其他镜像的基础镜像时(比如用户的镜像需要从某为准备好的位置添加源代码,或者用户需要执行特定于构建镜像的环境的构建脚本),该命令就会执行。
如创建镜像image-A

FROM ubuntu
...
ONBUILD ADD . /var/www
...

然后创建镜像image-B,指定image-A为基础镜像,如

FROM image-A
...

然后在构建image-B的时候,日志上显示如下:

Step 0 : FROM image-A
# Execting 1 build triggers
Step onbuild-0 : ADD . /var/www
...

USER

指定该镜像以什么样的用户去执行,如:

USER mongo

VOLUME

用来向基于镜像创建的容器添加卷。比如你可以将mongodb镜像中存储数据的data文件指定为主机的某个文件。(容器内部建议不要存储任何数据)
如:

VOLUME /data/db /data/configdb

注意:VOLUME 主机目录 容器目录

CMD

容器启动时需要执行的命令,如:

CMD /bin/bash

同样可以使用exec语法,如

CMD ["/bin/bash"]

当有多个CMD的时候,只有最后一个生效。

ENTRYPOINT

作用和用法和CMD一模一样

CMD和ENTRYPOINT的区别

敲黑板!!!非常重要
一定要注意!

一定要注意!

一定要注意!
CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:

  • CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会

如使用CMD ["/bin/bash"]ENTRYPOINT ["/bin/bash"]后,再使用docker run -ti image启动容器,它会自动进入容器内部的交互终端,如同使用
docker run -ti image /bin/bash

但是如果启动镜像的命令为docker run -ti image /bin/ps,使用CMD后面的命令就会被覆盖转而执行bin/ps命令,而ENTRYPOINT的则不会,而是会把docker run 后面的命令当做ENTRYPOINT执行命令的参数
以下例子比较容易理解
Dockerfile中为

...
ENTRYPOINT ["/user/sbin/nginx"]

然后通过启动build之后的容器

docker run -ti image -g "daemon off"

此时-g "daemon off"会被当成参数传递给ENTRYPOINT,最终的命令变成了

/user/sbin/nginx -g "daemon off"
  • CMD和ENTRYPOINT都存在时

CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:

...
ENTRYPOINT ["echo","hello","i am"]
CMD ["docker"]

之后启动构建之后的容器

  • 使用docker run -ti image

    输出“hello i am docker”

  • 使用docker run -ti image world

    输出“hello i am world”

指令比较多,可以通过分类(如开头的表格)的办法去记忆

示例

自己写了个简单的示例,非常简单

FROM ubuntu
MAINTAINER vector4wang xxxx@qq.com

WORKDIR /usr/local/docker
ADD temp.zip ./add/
COPY temp.zip ./copy/
EXPOSE 22
RUN groupadd -r vector4wang && useradd -r -g vector4wang vector4wang
USER vector4wang

ENTRYPOINT ["/bin/bash"]

下面是运行过程
1.png
2.png

(动态图太大了上传不了)

注意 登录之后的用户名和ADD、COPY进去的文件

后记

以上只是自己通过看书写demo和浏览其他人的博文所总结出来的,之后在实战的过程中会把遇到的一些实际问题追加进来。

参考: https://www.cnblogs.com/lienhua34/p/5170335.html

优快云:http://blog.youkuaiyun.com/qqhjqs?viewmode=list
博客:http://vector4wang.tk/
简书:https://www.jianshu.com/u/223a1314e818
Github:https://github.com/vector4wang
Gitee:https://gitee.com/backwxc
如果感觉有帮助的话,点个赞哦~

<think>好的,我现在需要帮助用户解决如何使用Dockerfile构建和打包Docker镜像的问题。根据用户提供的引用内容,我得先整理出关键步骤和指令。首先,Dockerfile的结构和常用指令是基础,比如FROM、WORKDIR、COPY、RUN这些,用户可能已经看过示例,但需要更系统的指导。然后,构建命令docker build -t image_name . 这个应该强调,包括-t参数和上下文路径的重要性。用户可能还关心优化方法,比如多阶段构建或者缓存机制,引用里提到过优化需求,但具体步骤可能需要展开。另外,用户提到的引用[4]中的Python例子,可以作为具体案例来说明,这样更直观。还要注意常见问题,比如Dockerfile的命名是否正确,指令的大小写,路径是否正确。最后生成相关问题的时候,要考虑用户接下来可能遇到的问题,比如运行容器、Dockerfile指令详解、多阶段构建,以及和docker-compose的区别,这些引用里有提到,可以引导用户进一步学习。需要确保回答结构清晰,分步骤说明,并给出示例,让用户能一步步操作。同时,检查是否有遗漏的要点,比如EXPOSE和CMD的作用,是否需要解释。可能用户是初学者,所以语言要简洁明了,避免过于技术化的术语,但又要准确。最后确认引用标注正确,每个步骤都有对应的引用支持,比如构建过程引用[4],优化方法引用[3]或[4]。这样用户就能按照指南操作,并解决常见问题。</think>### 如何根据 Dockerfile 打包 Docker 镜像 #### 一、Dockerfile 基础概念 1. **Dockerfile 的作用** Dockerfile 是一个包含构建镜像指令的文本文件,通过逐行执行指令,可以自动化地创建包含应用程序运行环境的镜像[^3]。 2. **镜像与容器的关系** 镜像是静态的模板,容器是镜像的运行实例。Dockerfile 定义了镜像的构建规则,通过镜像可快速启动多个相同环境的容器[^1]。 --- #### 二、Dockerfile 构建步骤详解 1. **编写 Dockerfile 文件** 常用指令: - `FROM`:指定基础镜像(如 `python:3.9-slim`)[^4] - `WORKDIR`:设置容器内的工作目录(如 `/app`) - `COPY`:将本地文件复制到镜像中(如 `COPY requirements.txt ./`) - `RUN`:执行命令(如安装依赖 `pip install ...`) - `EXPOSE`:声明容器运行时监听的端口(如 `EXPOSE 5000`) - `CMD`:指定容器启动时运行的命令(如 `CMD ["python", "app.py"]`) **示例 Dockerfile**: ```dockerfile # 基于 Python 官方镜像 FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"] ``` 2. **构建镜像** 在 Dockerfile 所在目录执行: ```bash docker build -t my-app:1.0 . ``` - `-t`:指定镜像名称和标签(格式:`name:tag`) - `.`:表示当前目录为构建上下文[^4] 3. **验证镜像** ```bash docker images # 查看已构建的镜像 docker run -d -p 5000:5000 my-app:1.0 # 启动容器 ``` --- #### 三、常见问题与优化 1. **依赖缓存优化** 将频繁变动的指令(如 `COPY . .`)放在文件末尾,利用 Docker 分层缓存机制加速构建[^3]。 2. **多阶段构建** 减少镜像体积: ```dockerfile # 构建阶段 FROM python:3.9-slim AS builder COPY requirements.txt . RUN pip install --user -r requirements.txt # 运行阶段 FROM python:3.9-slim COPY --from=builder /root/.local /root/.local COPY . . CMD ["python", "app.py"] ``` 3. **文件忽略** 创建 `.dockerignore` 文件排除无关文件(如 `__pycache__/`、`.git/`),避免增大镜像体积[^4]。 --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值