Docker 教程

Docker 构建镜像

点击学习开源企业 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 可显示它们。

示例

利用 Dockerfile 构建镜像

假设你有一个包含以下内容的 app 目录:

6bad0c0b416e9ebbfa9b1772c53657ae_1724305110983-a641f0d1-6b79-4f60-a6b5-c2d756aae2a0_x-oss-process=image%2Fformat%2Cwebp.png

(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 软件 教程。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号