当您开始使用 Docker 时,了解什么是 Dockerfile 很重要。无论您在映像中使用何种操作系统,您都将在您处理的每个项目中使用 Dockerfile。
Dockerfile 类似于包含构建 Docker 映像的所有命令的批处理脚本。第一行说明了基础映像,然后按照说明安装所需的模块、复制文件并部署代码,从而形成一个工作环境。每个 Dockerfile 都必须以 FROM 指令开头。这会告诉 Docker 在构建最终映像时要使用的基础映像。在本例中,我们使用的是 ubuntu 标准操作系统映像。您可以找到适用于您正在使用的任何技术的许多不同操作系统和开发环境的映像。
LABEL 指令将元数据添加到图像。LABEL 是键值对。您可以将多个标签添加到 Dockerfile 以包含您想要的任何自定义信息。在此示例中,我们创建了一个名为“maintainer”的键并将其设置为等于右侧的文本。当您使用 docker inspect 命令查看有关 Docker 对象的低级信息时,标签是可见的,这有助于使您的项目井然有序。
LABEL maintainer="Prakhar Srivastav <prakhar@prakhar.me>"
RUN 指令将在当前图像之上的新层中执行任何命令并提交结果。生成的提交图像将用于 Dockerfile 中的下一步。所有指令都按顺序执行,因此您必须小心按照它们应该运行的确切顺序添加运行指令。在此示例中,我们正在为 Python 和节点安装所需的系统范围依赖项,因为运行快餐车网站需要这些。
# install system-wide deps for python and node
RUN apt-get -yqq update
RUN apt-get -yqq install python3-pip python3-dev curl gnupg
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash
RUN apt-get install -yq nodejs
ADD 指令从左侧列表中复制新文件、目录或远程文件 URL,并将它们添加到右侧列表路径中图像的文件系统中。目标路径位于由 Dockerfile 构建的图像内。
# copy our application code
ADD flask-app /opt/flask-app
打开终端并执行命令 docker-compose up 然后检查容器的文件系统以找到目标文件路径。如果需要,您甚至可以将此图像保存为参考以供日后使用。
要从正在运行的容器中保存图像,请通过键入 docker ps 获取容器 ID。然后,使用容器 ID 运行 docker commit 命令,然后使用自定义图像名称和版本。就是这样!您可以运行 docker images 命令来确认您的新图像已创建。
docker commit [container id] [image name]:[image version]
WORKDIR 指令为 Dockerfile 中跟在它后面的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。在此示例中,节点包管理器命令在已定义的工作目录中运行。
WORKDIR /opt/flask-app
RUN npm install
RUN npm run build
RUN pip3 install -r requirements.txt
EXPOSE 指令通知 Docker 容器在运行时监听指定的网络端口。EXPOSE 不会使容器的端口可供主机访问。
# expose port
EXPOSE 5000
最后,我们有 CMD 指令。一个 Dockerfile 中只能有一条 CMD 指令。如果您列出多个 CMD,则只有最后一个 CMD 会生效。CMD 的主要目的是为正在执行的容器提供默认值。在此示例中,我们正在为位于工作目录根目录中的网站运行应用程序脚本,并将应用程序命名为 python3。
# start app
CMD [ "python3", "./app.py" ]
就是这样!通过执行 docker-compose down 命令停止正在运行的容器。返回 Dockerfile 并使用快捷键 Ctrl+k+u 取消注释所有内容。保存您的工作并执行 docker-compose up。
打开浏览器并导航到端口 5000 上的本地主机。您应该会看到美食网站!