在运行的 docker 容器中安装包

Maj*_*Kid 6 apt docker dockerfile

我一直在使用 docker 容器来构建 Chrome 浏览器(在 Debian 10 上为 Android 构建)。我已经创建了一个 Dockerfile,其中包含我需要的大部分包。

现在,在构建并运行容器后,我按照说明进行操作,该说明要求我执行安装脚本 (./build/install-build-deps-android.sh)。在这个脚本中,执行了多个 apt install 命令。

我现在的问题是,有没有办法在不重建容器的情况下安装这些包?下载和构建它花费了相当长的时间,再加上每次需要一个新包时重建一个容器似乎不是最理想的。执行安装脚本时出现的错误是:

./build/install-build-deps-android.sh: line 21: lsb_release: command not found
Run Code Online (Sandbox Code Playgroud)

(我猜会有多个丢失的包)。使用 apt 将给出:

root@677e294147dd:/android-build/chromium/src# apt install nginx
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package nginx
Run Code Online (Sandbox Code Playgroud)

(nginx 仅作为安装示例)。

我很感激任何提示,因为我只能找到使用 Dockerfile 安装软件包的指南。

Maj*_*Kid 11

感谢@adnanmuttaleb和@David Maze(不幸的是,他们只回复了,所以我不能接受他们的答案)。

我所做的是编辑 Dockerfile 以进行后续更新(已经发生),并使用 exec 命令从容器外部安装所需的依赖项。还记得要

apt update
Run Code Online (Sandbox Code Playgroud)

否则你找不到任何东西......

  • 这成功了。谢谢。这可以标记为正确答案 (2认同)

小智 7

您可以使用 docker 提交:

  1. 启动你的容器 sudo docker run IMAGE_NAME
  2. 使用 bash 访问您的容器: sudo docker exec -it CONTAINER_ID bash
  3. 在容器内安装你需要的任何东西
  4. 退出容器的 bash
  5. 提交您的更改: sudo docker commit CONTAINER_ID NEW_IMAGE_NAME

如果您现在运行docker images,您将看到NEW_IMAGE_NAME在您的本地图像下列出。

下次启动 docker 容器时,使用您刚刚创建的新 docker 镜像:
sudo docker run **NEW_IMAGE_NAME**- 这将包括您的其他安装。

根据以下教程回答:How to commit changes to docker image


swi*_*mer 6

Arye建议的步骤略有不同,对我来说效果更好:

  1. 从镜像创建容器并以交互方式访问:docker run -it IMAGE_NAME bin/bash
  2. 根据需要修改容器
  3. 离开容器:exit
  4. 列出已启动的容器:docker ps -a并复制刚刚修改的容器的ID
  5. 保存到新图像:docker commit CONTAINER_ID NEW_IMAGE_NAME

如果您尚未遵循Linux 的安装后步骤 ,则可能需要在 Docker 命令前添加前缀sudo.

  • 比 arye 更少的步骤以及使用“docker ps -a”获取容器 ID 的提示是我所缺少的。谢谢。 (2认同)