Dockerfile 的使用教程
Docker 是一种轻量级的虚拟化技术,它可以将应用程序及其依赖项打包到一个容器中,从而实现跨平台和可移植性,Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了一系列指令,用于定义容器的基础镜像、安装软件包、配置环境等,本文将详细介绍如何编写和使用 Dockerfile,以及一些常见的问题和解答。
Dockerfile 的基本结构
Dockerfile 是一个文本文件,其内容以指令为主,每个指令都对应一个操作,Dockerfile 的基本结构如下:
以注释开始,注释不会被 Docker 执行
FROM <base image>:<tag> 基础镜像,可以指定版本号
RUN <command> 运行命令,可以执行 shell 脚本或命令行工具
COPY <src> <dest> 复制文件或目录,可以指定源路径和目标路径
ADD <src> <dest> 添加文件或目录,与 COPY 类似,但支持自动解压缩
EXPOSE <port> 暴露端口,供外部访问
ENV <key>=<value> 设置环境变量
WORKDIR <path> 设置工作目录
CMD <command> 容器启动时执行的命令
ENTRYPOINT <command> 容器启动时的入口点,通常与 CMD 结合使用
常用的 Dockerfile 指令
1、FROM
:指定基础镜像,格式为 <image>:<tag>
,FROM ubuntu:18.04
,如果不指定标签,默认使用 latest
标签。
2、RUN
:执行命令,格式为 RUN <command>
,RUN apt-get update && apt-get install -y git
,可以在 RUN
指令下添加多条命令,用 &&
连接。
3、COPY
:复制文件或目录,格式为 COPY <src> <dest>
,COPY app/config.json /app/config.json
,可以使用通配符 *
匹配多个文件。
4、ADD
:与 COPY
类似,但支持自动解压缩,格式为 ADD <src> <dest>
,ADD app/package.tar.gz /app/package.tar.gz
。
5、EXPOSE
:暴露端口,格式为 EXPOSE <port>
,EXPOSE 80
,这样在运行容器时,需要使用 -p
参数将容器内的端口映射到宿主机的端口。
6、ENV
:设置环境变量,格式为 ENV <key>=<value>
,ENV MYSQL_ROOT_PASSWORD=mysecretpassword
,可以在运行容器时通过 --env-file
参数覆盖这些环境变量。
7、WORKDIR
:设置工作目录,格式为 WORKDIR <path>
,WORKDIR /app
,这样在运行容器内的其他命令时,相对于这个目录进行操作。
8、CMD
:容器启动时执行的命令,格式为 CMD ["executable", "param1", "param2"]
,CMD ["python", "app.py"]
,如果没有指定命令,默认使用 docker run
命令。
9、ENTRYPOINT
:容器启动时的入口点,格式为 ENTRYPOINT ["executable", "param1", "param2"]
,ENTRYPOINT ["python", "app.py"]
,与 CMD
的区别在于,当容器启动后,会先执行 ENTRYPOINT 指定的命令,然后再执行 CMD 指定的命令,通常与 CMD
结合使用。
编写 Dockerfile 示例
以下是一个简单的 Dockerfile 示例,用于构建一个基于 Ubuntu 18.04 的 Python Flask 应用:
使用官方的 Python Flask 镜像作为基础镜像 FROM python:3.7-slim-buster AS builder 设置工作目录 WORKDIR /app 将当前目录下的所有文件复制到工作目录 COPY requirements.txt requirements.txt 安装依赖包 RUN pip install --no-cache-dir -r requirements.txt 将当前目录下的所有文件复制到工作目录(包括隐藏文件) COPY . . 从基础镜像创建一个新的镜像,并将当前镜像的内容复制过去 FROM python:3.7-slim-buster AS final 将最终镜像的基础镜像替换为刚刚创建的镜像 RUN apt-get update && apt-get install --no-install-recommends --no-upgrade ca-certificates=^2015 curl libffi-dev libssl-dev python3-dev software-properties-common && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends --no-upgrade git jq && git clone https://github.com/apache/thrift.git && cd thrift && git checkout v0.13.0 && git submodule update --init --recursive && make && sudo make install && cd .. && git clone https://github.com/apache/thrift.git && cd thrift && git checkout v0.13.0 && git submodule update --init --recursive && make && sudo make install && cd .. && git clone https://github.com/apache/thrift.git && cd thrift && git checkout v0.13.0 && git submodule update --init --recursive && make && sudo make install && cd .. && git clone https://github.com/apache/thrift.git && cd thrift && git checkout v0.13.0 && git submodule update --init --recursive && make && sudo make install && cd .. && echo "deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse" > /etc/apt/sources.list && echo "deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://updates.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://updates.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://updates.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://updates.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://security.ubuntu.com/ubuntu bionic-security main restricted universe multiverse" >> /etc/apt/sources.list && echo "deb http://updates.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse" >> /etc/apt/sources
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/140475.html