我正在尝试设置一个.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映像开始。虽然universal
devcontainer镜像确实使用Ubuntu,但大多数更具体的镜像往往只是Debian。选择一个基于debian的发行版是最安全的,特别是如果你正在安装其他功能。
确保将ghcr.io/devcontainers/features/common-utils:2
特性添加到devcontainer.json
文件中。您甚至可以从将标准python映像的定义复制到存储库中开始,并根据需要对其进行修改(例如在Dockerfile
中安装bazel)。
或者,您可以从自己的devcontainer.json
和Dockerfile
开始,其中Dockerfile
从FROM mcr.microsoft.com/devcontainers/python:0-3.11
开始。该映像中的devcontainer.json
作为元数据包含在构建的映像中,因此devcontainer在构建自定义映像时知道该基本映像的配置。
在使用自定义开发容器时,您会注意到的第一件事是代码空间的创建时间大大增加了。您可以通过使用预构建来解决这个问题。如果你有多个repo将使用相同的基本映像,你可以在自己的repo中构建映像,然后将该映像部署到容器注册表(例如dockerhub或ghcr.io),然后在代码空间repo的devcontainer.json
中引用该映像,就像使用标准python映像一样。