点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。
在 Docker 中,使用 docker image build 命令构建 Docker 镜像。
它允许你从一个现有的基础镜像(如官方的 Ubuntu、CentOS 等操作系统镜像,或者其他已有的自定义镜像)开始构建新的镜像。
语法如下:
用法 docker buildx build [OPTIONS] PATH | URL | - 开始构建 别名: docker build, docker builder build, docker image build, docker buildx b 选项: --add-host strings 添加自定义主机到 IP 的映射(格式:"host:ip) --allow string 允许额外的权限(例如,“network.host”、"security.insecure) --annotation stringArray 为镜像添加注释 --attest stringArray 认证参数(格式:"type=sbom,generator=image) --build-arg stringArray 设置构建时变量 --build-context stringArray 附加构建上下文(例如:name=path) --builder string 覆盖已配置的生成器实例(默认为 "default") --cache-from stringArray 外部缓存源(例如,“user/app:cache”、"type=local,src=path/to/dir) --cache-to stringArray 缓存导出目的地(例如,“user/app:cache”, “type=local,dest=path/to/dir”) --call string 设置评估构建的方法(“check”、“outline”、“targets”)(默认为 "build") --cgroup-parent string 设置联编过程中 “RUN ”指令的父 cgroup --check “--call=check” 的简称(默认值) -f、--file string Dockerfile 的名称(默认:"PATH/Dockerfile") --iidfile string 将镜像 ID 写入文件 --label stringArray 为镜像设置元数据 --load “--output=type=docker” 的缩写 --metadata-file string 将构建结果元数据写入文件 --network string 设置构建过程中 “RUN” 指令的联网模式(默认为 “default”)。 --no-cache 在构建镜像时不使用缓存 --no-cache-filter stringArray 不缓存指定阶段 -o, --output stringArray 输出目标(格式:"type=local,dest=path") --platform stringArray 设置构建的目标平台 --progress string 设置进度输出类型(“auto”、“plain”、“tty”、“rawjson”)。使用 plain 显示容器输出(默认为 "auto") --provenance string “--attest=type=provenance” 的缩写 --pull 总是尝试提取所有引用的镜像 --push “--output=type=registry” 的缩写 -q,--quiet (静音)在成功时抑制编译输出并打印镜像 ID --sbom string “--attest=type=sbom” 的缩写 --secret stringArray 要向构建过程公开的秘密(格式:“id=mysecret[,src=/local/secret]”)。 --shm-size bytes 用于构建容器的共享内存大小 --ssh stringArray SSH 代理套接字或密钥(格式:“default|<id>[=default/id>]”): “default|<id>[=<socket>|<key>[,<key>]]") -t, --tag stringArray 名称和可选标签(格式:"name:tag”) --target string 设置要构建的目标构建阶段 --ulimit ulimit 限制选项(默认为 []) 实验命令和标记会被隐藏。设置 BUILDX_EXPERIMENTAL=1 可显示它们。
假设你有一个包含以下内容的 app 目录:
(1)Dockerfile:
FROM ubuntu:latest RUN apt-get update && apt-get install -y python3 COPY . /app WORKDIR /app CMD ["python3", "main.py"]
(2)main.py:一个简单的 Python 脚本,监听 8080 端口,直接返回用户输入的值。
#/usr/bin/env python3 # -*- coding: utf-8 -*- import http.server import socketserver class EchoHandler(http.server.SimpleHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['Content-Length']) post_data = self.rfile.read(content_length).decode('utf-8') self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write(post_data.encode('utf-8')) def do_GET(self): self.send_response(200) self.send_header('Content-type', 'text/plain') self.end_headers() self.wfile.write(self.path.encode('utf-8')) with socketserver.TCPServer(("", 8080), EchoHandler) as httpd: print("Start the server on port 8080...") httpd.serve_forever()
如果服务启动成功,用户输入 http://localhost:8080/hello,将在页面显示“/hello”。
(3)在这个 app 目录下执行以下命令来构建镜像:
root@hxstrive:~/app# docker image build -t myapp . [+] Building 158.1s (9/9) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 157B 0.0s => [internal] load metadata for docker.io/library/ubuntu:latest 68.0s => [internal] load .dockerignore 0.1s => => transferring context: 2B 0.0s => [1/4] FROM docker.io/library/ubuntu:latest@sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee 0.2s => => resolve docker.io/library/ubuntu:latest@sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee 0.0s => => sha256:8a37d68f4f73ebf3d4efafbcf66379bf3728902a8038616808f04e34a9ab63ee 1.34kB / 1.34kB 0.0s => => sha256:d35dfc2fe3ef66bcc085ca00d3152b482e6cafb23cdda1864154caf3b19094ba 424B / 424B 0.0s => => sha256:edbfe74c41f8a3501ce542e137cf28ea04dd03e6df8c9d66519b6ad761c2598a 2.30kB / 2.30kB 0.0s => [internal] load build context 0.1s => => transferring context: 982B 0.0s => [2/4] RUN apt-get update && apt-get install -y python3 89.1s => [3/4] COPY . /app 0.1s => [4/4] WORKDIR /app 0.1s => exporting to image 0.4s => => exporting layers 0.3s => => writing image sha256:3577a4310626bcecd34215804610d6e73fabe87f9a5c0e309f8c8f3e3d39b6ae 0.0s => => naming to docker.io/library/myapp 0.0s
(4)查看构建后的镜像
root@hxstrive:~/app# docker image ls | grep myapp myapp latest 3577a4310626 41 seconds ago 158MB
(5)根据镜像启动一个容器
root@hxstrive:~/app# docker run -d -p 8080:8080 myapp 6a2896bec3b61596e837aec4385b3a25b9ab13ef826c4378d32660366968f3e2
(6)访问容器中提供的服务
root@hxstrive:~/app# curl http://localhost:8080/hello /hello root@hxstrive:~/app#
注意:这个命令会以当前目录(. 表示当前目录)为上下文,读取Dockerfile并构建一个名为myapp的镜像。
(1) 指定构建上下文路径:
docker image build -t myapp /path/to/dockerfiles
(2)添加标签,可以在构建时为镜像添加多个标签。例如:
docker image build -t myapp:v1 -t myapp:latest.
这将构建一个名为myapp的镜像,并同时添加两个标签v1和latest。
(3) 设置构建参数,如果你的Dockerfile中使用了构建参数,可以在构建时通过--build-arg参数传递这些参数的值。例如,Dockerfile中有这样一行:ARG version=1.0,可以这样构建:
docker image build --build-arg version=2.0 -t myapp.
这将使用 version=2.0 这个值来构建镜像。
点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。