Docker-DockerFile
能不能从0或者从其他镜像进行编写配置文件? 能不能先写好配置文件然后一键构建镜像? Dockerfile 它是一个文本文件,里面包含了一系列指令(Instructions)。 它是镜像的“配方”或“蓝图”。docker build 命令会读取这个文件,然后根据指令一步步地构建出一个新的 Docker 镜像。 核心思想:分层构建。Dockerfile 中的每一条指令都会创建一个新的镜像层(Layer)。Docker 会巧妙地缓存这些层,如果指令没有变化,下次构建时会直接使用缓存,大大加快了构建速度。 常用指令 指令 作用 示例与说明 FROM 指定基础镜像。所有构建都必须从一个基础镜像开始。 FROM python:3.9-slim 最佳实践:选择官方、轻量(如 slim, alpine)且版本明确的镜像。 WORKDIR 设置工作目录。后续的 RUN, CMD, COPY 等指令都会在这个目录下执行。 WORKDIR /app 最佳实践:先设置工作目录,避免在各处使用绝对路径,让 Dockerfile 更清晰。 COPY 复制文件或目录。从构建上下文(通常是 Dockerfile 所在目录)复制到镜像内部。 COPY ./requirements.txt . . 代表当前工作目录,即 /app。推荐使用 COPY 而不是 ADD,因为它的行为更明确。 RUN 在镜像构建过程中执行命令。主要用于安装软件包、编译代码等。 RUN pip install -r requirements.txt 每条 RUN 指令都会创建一个新的层。为了减小镜像体积,应将多个命令用 && 连接起来。 EXPOSE 声明容器运行时监听的端口。这只是一个元数据声明,不起实际的端口映射作用。 EXPOSE 5000 它告诉使用者这个镜像的服务会监听 5000 端口,实际映射仍需在 docker run -p 中指定。 ENV 设置环境变量。这个变量在镜像的整个生命周期中都存在。 ENV FLASK_APP=app.py 用于配置应用,非常灵活。 CMD 容器启动时执行的默认命令。一个 Dockerfile 中只能有一条 CMD 生效。 CMD ["flask", "run", "--host=0.0.0.0"] 如果 docker run 命令后面跟了其他命令,CMD 会被覆盖。推荐使用 Exec 格式(JSON 数组)。 ENTRYPOINT 配置容器的入口点。与 CMD 类似,但不容易被覆盖。 ENTRYPOINT ["python", "-m"] 常用于制作“工具型”容器。CMD 的内容会作为参数传递给 ENTRYPOINT。 CMD 与 ENTRYPOINT 的区别 CMD: 设置默认命令,容易被覆盖。适合为容器提供一个默认的、可被用户轻易修改的执行任务。 ENTRYPOINT: 设置主要命令,不易被覆盖。适合将容器制作成一个可执行程序。 CMD 和 ENTRYPOINT 都有两种语法形式 Exec 格式 (推荐): CMD ["executable", "param1", "param2"] Shell 格式: CMD command param1 param2 ...