linux下安装 GitLab Docker 镜像

极狐GitLab Docker 镜像是极狐GitLab 的整体镜像,在单个容器中运行所有必要的服务。

Docker 镜像不包括邮件传输代理 (MTA)。推荐的解决方案是添加在单独容器中运行的 MTA(例如 Postfix 或 Sendmail)。作为另一种选择,您可以直接在极狐GitLab 容器中安装 MTA,但这会增加维护开销,因为您可能需要在每次升级或重新启动后重新安装 MTA。

您不应在 Kubernetes 中部署极狐GitLab Docker 镜像,因为它会造成单点故障。

Docker for Windows 不受官方支持。存在卷权限的已知问题,以及潜在的其他未知问题。

先决条件

Docker 是必需的。查看官方安装文档

设置卷位置

在设置其他所有内容之前,请配置一个新的环境变量 $GITLAB_HOME,指向配置、日志和数据文件所在的目录。 确保该目录存在并且已授予适当的权限。

对于 Linux 用户,将路径设置为 /srv/gitlab:

export GITLAB_HOME=/srv/gitlab

对于 macOS 用户,使用用户的 $HOME/gitlab 目录:

export GITLAB_HOME=$HOME/gitlab

极狐GitLab 容器使用主机装载的卷来存储持久数据:

本地位置

容器位置

使用

$GITLAB_HOME/data

/var/opt/gitlab

用于存储应用程序数据。

$GITLAB_HOME/logs

/var/log/gitlab

用于存储日志。

$GITLAB_HOME/config

/etc/gitlab

用于存储极狐GitLab 配置文件。

安装

极狐GitLab Docker 镜像可以通过多种方式运行:

使用 Docker Engine 安装极狐GitLab

您可以微调这些目录以满足您的要求。 一旦设置了 GITLAB_HOME 变量,您就可以运行镜像:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

这将下载并启动极狐GitLab 容器,并发布访问 SSH、HTTP 和 HTTPS 所需的端口。所有极狐GitLab 数据将存储在 $GITLAB_HOME 的子目录中。系统重启后,容器将自动 restart。

如果您使用的是 SELinux,请改为运行以下命令:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

这将确保 Docker 进程有足够的权限在挂载的卷中创建配置文件。

如果您使用 Kerberos 集成 ,您还必须发布您的 Kerberos 端口(例如,--publish 8443:8443)。否则会阻止使用 Kerberos 进行 Git 操作。

初始化过程可能需要很长时间。 您可以通过以下方式跟踪此过程:

sudo docker logs -f gitlab

启动容器后,您可以访问 gitlab.example.com(如果您在 macOS 上使用 boot2docker,则可以访问 http://192.168.59.103)。Docker 容器开始响应查询可能需要一段时间。

访问极狐GitLab URL,并使用用户名 root 和来自以下命令的密码登录:

sudo docker exec-it gitlab grep'Password:' /etc/gitlab/initial_root_password

密码文件将在 24 小时后的第一次重新配置运行中自动删除。

使用 Docker Compose 安装极狐GitLab

使用 Docker Compose,您可以轻松配置、安装和升级基于 Docker 的极狐GitLab 安装实例:

  1. 安装 Docker Compose

  1. 创建一个 docker-compose.yml 文件:

version: '3.6'
services:
  web:
    image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'
        # Add any other gitlab.rb configuration here, each on its own line
    ports:
      - '80:80'
      - '443:443'
      - '22:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'
  1. 确保您在与 docker-compose.yml 相同的目录下并启动极狐GitLab:

docker compose up -d

阅读预配置 Docker 容器部分,了解 GITLAB_OMNIBUS_CONFIG 变量是如何工作的。

下面是另一个 docker-compose.yml 示例,其中极狐GitLab 在自定义 HTTP 和 SSH 端口上运行。注意 GITLAB_OMNIBUS_CONFIG 变量如何匹配 ports 部分:

version: '3.6'
services:
  web:
    image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://gitlab.example.com:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

这与使用 --publish 8929:8929 --publish 2224:22 相同。

使用 Docker swarm 模式安装极狐GitLab

使用 Docker swarm 模式,您可以轻松地在 swarm 集群中配置和部署基于 Docker 的极狐GitLab 安装实例。

在 swarm 模式下,您可以利用 Docker secretDocker 配置 以高效安全地部署您的极狐GitLab 实例。 Secrets 可用于安全地传递您的初始 root 密码,而无需将其作为环境变量公开。 配置可以帮助您保持极狐GitLab 镜像尽可能通用。

这是一个使用 secret 和配置将具有四个 runner 的极狐GitLab 部署为 stack 的示例:

  1. 设置 Docker swarm

  1. 创建一个 docker-compose.yml 文件:

version: "3.6"
services:
  gitlab:
    image: registry.gitlab.cn/omnibus/gitlab-jh:latest
    ports:
      - "22:22"
      - "80:80"
      - "443:443"
    volumes:
      - $GITLAB_HOME/data:/var/opt/gitlab
      - $GITLAB_HOME/logs:/var/log/gitlab
      - $GITLAB_HOME/config:/etc/gitlab
    shm_size: '256m'
    environment:
      GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
    configs:
      - source: gitlab
        target: /omnibus_config.rb
    secrets:
      - gitlab_root_password
  gitlab-runner:
    image: gitlab/gitlab-runner:alpine
    deploy:
      mode: replicated
      replicas: 4
configs:
  gitlab:
    file: ./gitlab.rb
secrets:
  gitlab_root_password:
    file: ./root_password.txt

为简单起见,省略了 network 配置。 更多信息可以参考官方的撰写文件参考

  1. 创建 gitlab.rb 文件:

external_url 'https://my.domain.com/'
gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password').gsub("\n", "")
  1. 创建 root_password.txt 文件:

MySuperSecretAndSecurePassw0rd!
  1. 确保您与 docker-compose.yml 位于同一目录中并运行:

docker stack deploy --compose-file docker-compose.yml mystack

配置

容器使用官方的 Omnibus GitLab 包,所以所有的配置都在唯一的配置文件 /etc/gitlab/gitlab.rb 中完成。

要访问极狐GitLab 配置文件,您可以在正在运行的容器的上下文中启动 shell 会话。这将允许您浏览所有目录并使用您喜欢的文本编辑器:

sudo docker exec-it gitlab /bin/bash

您也可以只编辑/etc/gitlab/gitlab.rb:

sudo docker exec-it gitlab editor /etc/gitlab/gitlab.rb

打开 /etc/gitlab/gitlab.rb 后,请确保将 external_url 设置为指向有效 URL。

要从极狐GitLab 接收电子邮件,您必须配置 SMTP 设置,因为极狐GitLab Docker 镜像没有安装 SMTP 服务器。您可能还对 启用 HTTPS 感兴趣。

完成所需的所有更改后,您需要重新启动容器以重新配置极狐GitLab:

sudo docker restart gitlab

每当容器启动时,极狐GitLab 都会重新配置自身。 有关配置极狐GitLab 的更多选项,请查看配置文档

预配置 Docker 容器

您可以通过将环境变量 GITLAB_OMNIBUS_CONFIG 添加到 Docker 运行命令,来预配置 GitLab Docker 镜像。此变量可以包含任何 gitlab.rb 设置,并在加载容器的 gitlab.rb 文件之前进行评估。允许您配置外部 GitLab URL,并从 Omnibus GitLab 模板进行数据库配置或任何其他选项。 GITLAB_OMNIBUS_CONFIG 中包含的设置不会写入 gitlab.rb 配置文件,而是在加载时进行评估。

这是一个设置外部 URL 并在启动容器时启用 LFS 的示例:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

请注意,每次执行 docker run 命令时,都需要提供 GITLAB_OMNIBUS_CONFIG 选项。GITLAB_OMNIBUS_CONFIG 的内容在后续运行之间保留。

使用标签版本的极狐GitLab

提供极狐GitLab Docker 镜像的标记版本。

要使用特定的标记版本,请将 registry.gitlab.cn/omnibus/gitlab-jh:latest 替换为您要运行的极狐GitLab 版本,例如 registry.gitlab.cn/omnibus/gitlab-jh:14.5.0

在公共 IP 地址上运行极狐GitLab

您可以通过修改 --publish 标志让 Docker 使用您的 IP 地址并将所有流量转发到极狐GitLab 容器。

要在 IP 198.51.100.1 上公开极狐GitLab:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 198.51.100.1:443:443 \
  --publish 198.51.100.1:80:80 \
  --publish 198.51.100.1:22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

然后,您可以通过 http://198.51.100.1/https://198.51.100.1/ 访问您的极狐GitLab 实例。

在不同的端口上公开极狐GitLab

极狐GitLab 会占用容器内的某些端口。

如果您想使用与 80 (HTTP) 或 443 (HTTPS) 不同的主机端口,需要在 docker run 命令中添加一个单独的 --publish 指令。

例如,要在主机的端口 8929 上公开 Web 界面,并在端口 2289 上公开 SSH 服务:

  1. 使用以下 docker run 命令:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 8929:8929 --publish 2289:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \     
  registry.gitlab.cn/omnibus/gitlab-jh:latest

发布端口的格式是 hostPort:containerPort。在 Docker 的文档中阅读有关公开传入端口的更多信息。

  1. 进入正在运行的容器:

sudo docker exec-it gitlab /bin/bash
  1. 用您的编辑器打开 /etc/gitlab/gitlab.rb 并设置 external_url:

# For HTTP
external_url "http://gitlab.example.com:8929"

or

# For HTTPS (notice the https)
external_url "https://gitlab.example.com:8929"

此 URL 中指定的端口必须与 Docker 发布到主机的端口匹配。此外,如果 NGINX 监听端口没有在 nginx['listen_port'] 中明确设置,它将从 external_url 中拉取。有关更多信息,请参阅 NGINX 文档

  1. 设置 gitlab_shell_ssh_port:

gitlab_rails['gitlab_shell_ssh_port']=2289
  1. 最后,重新配置极狐GitLab:

gitlab-ctl reconfigure

按照上面的示例,您将能够从 Web 浏览器在 <hostIP>:8929 下访问极狐GitLab,并在端口 2289 下使用 SSH 进行推送。

可以在 Docker compose 部分找到使用不同端口的 docker-compose.yml 示例。

升级

在大多数情况下,升级极狐GitLab 就像下载最新的 Docker 标签镜像一样简单。

使用 Docker Engine 升级极狐GitLab

要升级使用 Docker Engine 安装的极狐GitLab:

  1. 进行备份,作为最低要求,备份数据库和极狐GitLab secrets 文件。

  1. 停止正在运行的容器:

sudo docker stop gitlab
  1. 移除现有容器:

sudo docker rm gitlab
  1. 拉取新镜像。例如,最新的极狐GitLab 镜像:

sudo docker pull registry.gitlab.cn/omnibus/gitlab-jh:latest
  1. 使用先前指定的 选项再次创建容器:

sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 443:443 --publish 80:80 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:Z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

在第一次运行时,极狐GitLab 将重新配置并升级自身。

使用 Docker compose 升级极狐GitLab

要升级使用 Docker Compose 安装的极狐GitLab:

  1. 进行备份,作为最低要求,备份数据库和极狐GitLab secrets 文件。

  1. 下载最新版本并升级您的极狐GitLab 实例:

docker compose pull
docker compose up -d

如果您使用标签代替,则需要先编辑 docker-compose.yml。

备份极狐GitLab

您可以使用以下命令创建极狐GitLab 备份:

docker exec-t <container name> gitlab-backup create

如果配置完全通过 GITLAB_OMNIBUS_CONFIG 环境变量提供(根据 “预配置 Docker 容器” 步骤),则意味着没有直接在 gitlab.rb 配置文件中设置,则不需要备份 gitlab.rb 文件。

从备份中恢复极狐GitLab 时,需要备份极狐GitLab secrets 文件,可以避免复杂的步骤。Secrets 文件存储在容器内的 /etc/gitlab/gitlab-secrets.json,或容器主机上的 $GITLAB_HOME/config/gitlab-secrets.json。

创建数据库备份

如果遇到问题,需要数据库备份来回滚极狐GitLab 升级。

docker exec -t <container name> gitlab-backup create SKIP=artifacts,repositories,registry,uploads,builds,pages,lfs,packages,terraform_state

备份被写入 /var/opt/gitlab/backups,它应该在 Docker 挂载的卷上。

故障排查

如果您在使用 Omnibus GitLab 和 Docker 时遇到问题,以下信息将有所帮助。

诊断潜在问题

读取容器日志:

sudo docker logs gitlab

进入正在运行的容器:

sudo docker exec-it gitlab /bin/bash

从容器内,您可以像 Omnibus 安装示例一样管理极狐GitLab 容器。

500 Internal Error

更新 Docker 镜像时,您可能会遇到所有路径都显示 500 页面的问题。如果发生这种情况,请重新启动容器以尝试纠正问题:

sudo docker restart gitlab

权限问题

从旧的极狐GitLab Docker 镜像更新时,您可能会遇到权限问题。当之前镜像中的用户未正确保留时,就会发生这种情况。存在修复所有文件权限的脚本。

要修复您的容器,请执行 update-permissions 并在之后重新启动容器:

sudo docker exec gitlab update-permissions
sudo docker restart gitlab

Windows/Mac: Error executing action run on resource ruby_block[directory resource: /data/GitLab]

在 Windows 或 Mac 上将 Docker Toolbox 与 VirtualBox 一起使用并使用 Docker 卷时,会发生此错误。/c/Users 卷挂载为 VirtualBox 共享文件夹,不支持所有 POSIX 文件系统功能。 不重新挂载就无法更改目录所有权和权限,并且极狐GitLab 失败。

我们的建议是切换到为您的平台使用本机 Docker 安装,而不是使用 Docker Toolbox。

如果您不能使用本机 Docker 安装(Windows 10 家庭版或 Windows 7/8),那么另一种解决方案是为 Docker 工具箱的 boot2docker 设置 NFS 挂载而不是 VirtualBox 共享。

Linux ACL 问题

如果您在 Docker 主机上使用文件 ACL,docker 组需要对卷的完全访问权限才能让极狐GitLab 工作:

getfacl $GITLAB_HOME# file: $GITLAB_HOME# owner: XXXX# group: XXXX
user::rwx
group::rwx
group:docker:rwx
mask::rwx
default:user::rwx
default:group::rwx
default:group:docker:rwx
default:mask::rwx
default:other::r-x

如果这些不正确,请将它们设置为:

sudo setfacl -mR default:group:docker:rwx $GITLAB_HOME

默认组是docker。如果您更改了组,请务必更新您的命令。

/dev/shm mount 在 Docker 容器中没有足够的空间

极狐GitLab 在 /-/metrics 带有 Prometheus 指标端点,用于公开有关极狐GitLab 运行状况和性能的各种统计信息。为此所需的文件被写入临时文件系统(如 /run 或 /dev/shm)。

默认情况下,Docker 分配 64MB 给共享内存目录(挂载在/dev/shm)。这不足以保存所有生成的 Prometheus 指标相关文件,并将生成如下错误日志:

writing value to /dev/shm/gitlab/sidekiq/gauge_all_sidekiq_0-1.db failed with unmapped file
writing value to /dev/shm/gitlab/sidekiq/gauge_all_sidekiq_0-1.db failed with unmapped file
writing value to /dev/shm/gitlab/sidekiq/gauge_all_sidekiq_0-1.db failed with unmapped file
writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file
writing value to /dev/shm/gitlab/sidekiq/histogram_sidekiq_0-0.db failed with unmapped file

除了从管理页面禁用 Prometheus Metrics 之外,解决此问题的推荐解决方案是将共享内存的大小增加到至少 256MB。 如果使用 docker run,可以通过传递标志 --shm-size 256m 来完成。 如果使用 docker-compose.yml 文件,shm_size 键可以用于此目的。

由于 json-file,Docker 容器耗尽了空间

Docker的默认日志驱动是json-file,默认不执行日志轮换。由于缺乏轮换,json-file 驱动程序存储的日志文件可能会为生成大量输出的容器消耗大量磁盘空间。这会导致磁盘空间耗尽。要解决此问题,请在可用时使用 journald 作为日志记录驱动程序,或其他支持的驱动程序与本地轮换支持。

启动 Docker 时出现缓冲区溢出错误

如果您收到此缓冲区溢出错误,您应该清除 /var/log/gitlab 中的旧日志文件:

buffer overflow detected : terminated
xargs: tail: terminated by signal 6

删除旧的日志文件有助于修复错误,并确保实例的干净启动。

<think>嗯,用户想解决GitLab Docker镜像在构建过程中体积不断增大的问题。我需要先回忆一下Docker镜像优化的常见方法。首先,Docker镜像过大的问题通常是由于构建过程中积累的中间层和未清理的依赖造成的。 我记得多阶段构建是一个有效的方法,可以分离构建环境和运行环境。例如,在构建阶段安装所有必要的工具和依赖,然后在最终镜像中只复制必要的文件,这样能显著减少镜像大小。比如,使用多阶段构建,用户可以在第一阶段用较大的基础镜像编译代码,然后在第二阶段使用Alpine这样的轻量级镜像,仅复制编译后的可执行文件。 接下来,选择合适的基础镜像也很重要。Alpine Linux体积小,适合作为运行环境的基础镜像。而如果用户使用Debian或Ubuntu,可以考虑使用slim版本,这些版本通常去除了不必要的包,减少体积。例如,使用FROM python:3.9-slim而不是默认的python:3.9。 然后,清理不必要的缓存和临时文件。在安装软件包后立即运行apt-get clean和rm -rf /var/lib/apt/lists/*可以删除apt缓存,减少层的大小。同样,对于yum或apk,也有类似的清理命令。比如,在安装软件包后添加yum clean all或者apk del .build-deps等。 另外,合并RUN指令也是一个技巧。每个RUN指令都会生成一个新的镜像层,合并多个命令到一个RUN指令中,可以减少层数,并且避免中间层残留不必要的文件。例如,将多个apt-get install命令合并成一个,并在最后统一清理缓存。 使用.dockerignore文件忽略不需要的文件,比如.git目录、临时文件等,这可以防止这些文件被发送到Docker守护进程,从而减小上下文大小和最终镜像体积。 工具方面,docker-slim可以分析容器运行时的文件使用情况,去除未使用的文件,生成更小的镜像。用户可以在构建后使用docker-slim build来优化镜像。 还有,定期更新基础镜像也很重要。通过设置--pull选项,确保每次构建都拉取最新的基础镜像,避免使用过时的版本可能存在安全漏洞或冗余文件。例如,在docker build命令中添加--pull参数。 用户提到的GitLab Docker镜像,可能涉及到GitLab Runner的配置。进入Runner容器后,检查构建过程中的步骤,找出哪些步骤生成了大文件或未清理的依赖。比如,构建过程中可能下载了多个依赖包,但未在后续步骤中清理,导致镜像层叠加增大体积。 举个例子,如果用户的Dockerfile中使用了多个RUN指令安装不同的软件包,每个RUN都会增加一层。合并这些RUN指令,并在最后统一清理缓存,可以有效减少层数和体积。此外,确保在构建过程中删除不必要的中间文件,如编译后的源码、下载的压缩包等。 另外,可能需要检查是否在镜像中包含了调试工具或文档,这些在生成环境中是不需要的。使用生产环境专用的基础镜像,并移除调试工具,可以进一步优化大小。 总结一下,优化Docker镜像大小需要综合使用多阶段构建、选择轻量级基础镜像、清理不必要的文件、合并指令、使用.dockerignore和工具辅助等方法。用户需要根据具体的Dockerfile内容,逐步分析每个步骤的优化空间,逐一应用这些技巧来减小镜像体积,避免持续增大。</think>### 分步解决方案 #### 1. 使用多阶段构建(Multi-stage Build) 将构建环境和运行环境分离。在第一阶段安装编译工具生成产物,第二阶段仅复制产物到轻量级基础镜像中,减少冗余文件。例如: ```dockerfile # 构建阶段 FROM golang:1.18 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 运行阶段 FROM alpine:latest COPY --from=builder /app/myapp /usr/local/bin/ CMD ["myapp"] ``` 此方法可减少镜像体积达60%以上[^1]。 #### 2. 选择轻量级基础镜像 替换默认镜像为Alpine、Distroless或Slim版本: ```dockerfile FROM node:18-alpine # 替代 node:18(体积从1GB降至80MB) ``` Alpine镜像仅包含必要依赖,体积比标准镜像小5-10倍[^2]。 #### 3. 清理缓存与临时文件 在`RUN`指令中合并清理操作: ```dockerfile RUN apt-get update \ && apt-get install -y build-essential \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean ``` 避免单独执行`apt-get clean`产生冗余层。 #### 4. 使用`.dockerignore`文件 忽略无关文件(如日志、缓存、测试文件): ``` .git **/*.log node_modules/ tmp/ ``` #### 5. 镜像瘦身工具 使用`docker-slim`自动分析并裁剪未使用文件: ```bash docker-slim build --target your-image:tag ``` 该工具可减少镜像体积30-70%。 #### 6. 层优化技巧 - **合并RUN指令**:减少层数 - **固定版本号**:避免依赖版本漂移 - **按需安装**:只保留运行时必要组件 ### 完整优化示例 ```dockerfile # 阶段1:构建 FROM python:3.9 AS builder COPY requirements.txt . RUN pip install --user -r requirements.txt # 阶段2:运行 FROM python:3.9-slim COPY --from=builder /root/.local /root/.local COPY src/ /app ENV PATH=/root/.local/bin:$PATH CMD ["python", "/app/main.py"] ``` ### 验证优化效果 ```bash docker images | grep your-image ``` 对比优化前后镜像的`SIZE`字段变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值