如何自动运行 apt-get update 和 apt-get upgrade 命令

61次阅读
没有评论

问题描述

在一个 Docker 容器中每次从镜像创建时,都需要以 root 用户身份运行一些命令。用户想知道是否可以自动化在每次创建容器时以 root 管理员用户身份运行这些命令。

解决方案

请注意以下操作可能因版本差异而有所不同,建议在操作前备份重要数据。

方案1:使用 Dockerfile 进行自动化

如果你正在使用一个现成的 Docker 镜像,而且想要在镜像的基础上安装额外的软件包,那么编写一个 Dockerfile 就可以实现命令的自动化。通过 Dockerfile,你可以创建一个包含你所需预安装内容的新镜像。

以下是一个示例 Dockerfile:

FROM pimcore/pimcore:PHP7.4-apache
RUN apt-get update && apt-get upgrade -y && apt-get install -y vim

然后使用 docker build 命令来构建一个带有所需内容的新镜像。例如,下面的命令将创建一个名为 my-phpapache:7.4 的镜像,你可以使用适合你的名称。这个镜像将会预安装 vim

docker build -t my-phpapache:7.4 .

注意,命令中的 . 表示在 Dockerfile 所在的同一目录中执行构建操作。

你可能会发现,通过 Dockerfile 将配置文件复制到镜像中,可能会减少在镜像中安装 vim 的需要。

方案2:使用启动脚本控制顺序

另一种方法是编写一个脚本来控制容器的启动顺序。你可以使用 docker run 命令手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

以下是一个简单的 Bash 脚本示例,它可以在容器 A 启动后启动容器 B:

#!/bin/bash
# 启动容器 A
docker run -d --name container_a your_image_a
# 等待容器 A 完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器 B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用 docker run 命令启动容器 A,并将其命名为 container_a。然后,使用一个循环来等待容器 A 完全启动(这里是通过在容器内运行 echo 命令来测试)。一旦容器 A 就绪,我们再使用 docker run 命令启动容器 B,并将其命名为 container_b

这种方法需要一定的手动操作,并且需要确保容器 A 和容器 B 之间的依赖关系设置正确。

以上方案中,使用 Dockerfile 进行自动化是更推荐的方式,可以更好地管理镜像的构建过程,而且可维护性更高。使用脚本来控制启动顺序可能增加复杂性,需要确保依赖关系的正确设置。

正文完