dockerfile 常用命令

导出所有包到 requirements.txt

# 导出当前环境的所有包(包含版本号)
conda list --export > requirements.txt

# 或者使用pip格式导出(推荐用于跨平台)
pip list --format=freeze > requirements.txt

# 忽略包的构建信息(包括平台标识),只保留包名和版本号:
conda env export --no-builds > environment.yml

 

docker 构建阶段和运行阶段

特性构建阶段 (Builder Stage)运行阶段 (Runtime Stage)
目的 编译、安装、构建应用程序 运行应用程序
包含内容 编译器、构建工具、开发依赖 仅运行时必要的文件
镜像大小 较大(包含构建工具) 较小(只包含运行时)
安全性 较低(可能包含敏感信息) 较高(最小化攻击面)

 

Dockerfile 指令完整详解

1. FROM - 指定基础镜像

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

参数说明:

  • <image>:基础镜像名称(必需)

  • <tag>:镜像标签,默认为 latest

  • AS <name>:为构建阶段命名(用于多阶段构建)

  • --platform:指定平台,如 linux/amd64

FROM ubuntu:20.04
FROM python:3.9-slim AS builder
FROM --platform=linux/amd64 nginx:alpine

2. RUN - 执行命令

作用:在镜像构建过程中执行命令

# Shell 格式(默认使用 /bin/sh -c)
RUN <command>

# Exec 格式(推荐)
RUN ["executable", "param1", "param2"]
RUN apt-get update && apt-get install -y curl
RUN ["/bin/bash", "-c", "echo 'Hello World'"]

3. COPY - 复制文件

作用:从构建上下文复制文件到镜像中

COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径>",... "<目标路径>"]

参数说明:

  • --chown:设置文件所有者

  • <源路径>:构建上下文中的文件/目录

  • <目标路径>:容器内的绝对路径

COPY package.json ./
COPY --chown=node:node . /app
COPY ["src/", "conf/", "/app/"]

COPY . . 是 Dockerfile 中的一条指令,它的含义是:

  • 第一个 . 表示宿主机(你的本地计算机)上的当前目录,也就是执行 docker build 命令时所在的目录,通常是你的 Flask 项目根目录。
  • 第二个 . 表示容器内部的当前工作目录,也就是通过 WORKDIR /app 设定的 /app 目录。
这条指令的作用是:将宿主机当前目录下的所有文件和文件夹(除了 .dockerignore 文件中排除的内容)复制到容器内的 /app 目录中。
对于 Flask 项目来说,这通常会包含:
  • 你的 Python 代码文件(如 app.py
  • 静态资源文件夹(static
  • 模板文件夹(templates
  • 其他项目必需的配置文件等
这样,容器内部就拥有了运行 Flask 应用所需的全部代码和资源。

4. ADD - 高级复制

作用:类似 COPY,但功能更多(支持 URL 和解压)

特殊功能:

  • 自动解压 tar、gzip 等压缩文件

  • 支持从 URL 下载文件

ADD https://example.com/file.tar.gz /tmp/
ADD app.tar.gz /app/  # 自动解压

5. CMD - 容器启动命令

作用:指定容器启动时的默认执行命令

# Exec 格式(推荐)
CMD ["executable", "param1", "param2"]

# Shell 格式
CMD command param1 param2

# 作为 ENTRYPOINT 的参数
CMD ["param1", "param2"]

重要特性:

  • 一个 Dockerfile 只能有一个 CMD

  • 容易被 docker run 的参数覆盖

CMD ["nginx", "-g", "daemon off;"]
CMD python app.py

6. ENTRYPOINT - 入口点

作用:配置容器启动时的可执行文件

# Exec 格式(推荐)
ENTRYPOINT ["executable", "param1", "param2"]

# Shell 格式
ENTRYPOINT command param1 param2

与 CMD 的配合:

  • ENTRYPOINT 定义主要命令

  • CMD 提供默认参数

  • docker run 参数会覆盖 CMD

ENTRYPOINT ["curl"]
CMD ["-s", "http://localhost"]

docker run my-image                          # 执行 curl -s http://localhost
docker run my-image -I http://google.com     # 执行 curl -I http://google.com

7. WORKDIR - 工作目录

作用:设置后续指令的工作目录

WORKDIR /path/to/workdir

特性:

  • 如果目录不存在会自动创建

  • 相对路径基于前一个 WORKDIR

  • 影响 RUNCMDCOPYADD 等指令

WORKDIR /app
WORKDIR src      # 现在路径是 /app/src
WORKDIR ../build # 现在路径是 /app/build

8. ENV - 环境变量

作用:设置环境变量

ENV NODE_ENV=production
ENV APP_HOME=/app USER=appuser
ENV PATH=/app/bin:$PATH

9. ARG - 构建参数

作用:定义构建时的变量

特性:

  • 只在构建过程中有效

  • 运行时不可用

  • 可以有默认值

ARG APP_VERSION=latest
ARG BUILD_NUMBER

FROM ubuntu:20.04
ARG APP_VERSION
LABEL version=${APP_VERSION}
docker build --build-arg APP_VERSION=2.0.0 --build-arg BUILD_NUMBER=123 .

10. EXPOSE - 暴露端口

作用:声明容器运行时监听的端口

EXPOSE 80/tcp
EXPOSE 443
EXPOSE 3000 5000 8080

注意:这仅是声明,实际端口映射需要在运行时指定

11. VOLUME - 数据卷

作用:创建挂载点用于数据持久化

VOLUME ["/var/log", "/data"]
VOLUME /app/uploads

12. USER - 设置用户

作用:指定运行容器时的用户

RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
USER 1000:1000

13. LABEL - 添加元数据

作用:为镜像添加元数据

LABEL version="1.0"
LABEL maintainer="dev@example.com"
LABEL description="My Application" \
      author="Dev Team"

14. HEALTHCHECK - 健康检查

作用:定义容器健康检查方式

 

 

posted @ 2025-09-25 14:23  wangssd  阅读(9)  评论(0)    收藏  举报