Dockerfile和多个图像(用于github代码空间)



我正在尝试设置一个.devcontainer.json文件在Github代码空间中使用。我想要的是有一个容器,它有基本的python映像,加上bazel映像,这样我就可以使用bazel,而不必在任何时候安装它,我创建一个新的工作空间。

我怎样才能做到这一点?

我对形势的混乱理解

据我所知,github代码空间将查找.devcontainer.json,按照说明构建容器,该容器将用于为新工作空间创建的虚拟机。

问题1:我已经在这里感到困惑,因为默认的python模板只指定"image": "mcr.microsoft.com/devcontainers/python:0-3.11"-但当然我的VM正在运行一个完整的操作系统,而不仅仅是python。这是否意味着默认情况下它会下载ubuntu和,然后将python镜像添加到容器中?

无论如何,我需要在这里添加bazel。在iuc中,最好的方法是使用功能,据我所知,这些功能是要添加到主图像中的附加图像。然而,bazel功能似乎已被弃用,目前无法使用。

所以我可能需要使用Dockerfile来设置我的devcontainer。我想这次我应该从ubuntu的基本镜像开始,而不是从python3.11镜像开始。

无论如何,如何在dockerfiles中添加安装bazel(和构建器)呢?理论上,我可以遵循bazel安装说明(目前包括下载并运行bazel-6.0.0-installer-linux-x86_64.sh脚本,为bazel和buildifier设置env变量,等等)。

这听起来很痛苦。另一方面,有一个官方bazel图像可在gcr。io/bazel-public/bazel,所以理想情况下我会使用这个。是否有一种方法可以简单地将docker映像添加到我的容器中?我已经找到了使用docker compose的建议,但坦率地说,我不知道这是怎么回事。

有人能推荐最简单的方法来安装bazel/buildifier/fix系统路径从一个基本的ubuntu镜像使用作为github代码空间开发的起点吗?

谢谢!

我知道这是几个月前的事了,但是为了其他人看,

这是否意味着默认情况下它会下载例如ubuntu,然后将python映像添加到容器中?

您可以在这里找到标准开发容器的源代码:https://github.com/devcontainers/images。在python镜像的例子中,它实际上是以with python开头的,而python又是在Debian 12(即bookworm)上构建的:

ARG VARIANT=3-bookworm
FROM python:${VARIANT}

所以我可能需要使用Dockerfile来设置我的devcontainer。我想这次我应该从ubuntu的基本镜像开始,而不是从python3.11镜像开始。

与标准基本映像一样,您可以从python映像开始。虽然universaldevcontainer镜像确实使用Ubuntu,但大多数更具体的镜像往往只是Debian。选择一个基于debian的发行版是最安全的,特别是如果你正在安装其他功能。

确保将ghcr.io/devcontainers/features/common-utils:2特性添加到devcontainer.json文件中。您甚至可以从将标准python映像的定义复制到存储库中开始,并根据需要对其进行修改(例如在Dockerfile中安装bazel)。

或者,您可以从自己的devcontainer.jsonDockerfile开始,其中DockerfileFROM mcr.microsoft.com/devcontainers/python:0-3.11开始。该映像中的devcontainer.json作为元数据包含在构建的映像中,因此devcontainer在构建自定义映像时知道该基本映像的配置。

在使用自定义开发容器时,您会注意到的第一件事是代码空间的创建时间大大增加了。您可以通过使用预构建来解决这个问题。如果你有多个repo将使用相同的基本映像,你可以在自己的repo中构建映像,然后将该映像部署到容器注册表(例如dockerhub或ghcr.io),然后在代码空间repo的devcontainer.json中引用该映像,就像使用标准python映像一样。

最新更新