我正在尝试设置一个.devcontainer.json
文件以在Github Codespace中使用。我想要的是有一个容器,其中有基本的python镜像,加上bazel镜像,这样我就可以使用bazel,而不必在任何时候安装它。
我如何才能做到这一点?
我对情况的混乱理解
据我所知,github codespace将查找.devcontainer.json
,按照说明构建一个容器,这个容器将用于为新工作区创建的虚拟机。
问题1:我已经感到困惑了,因为默认的python模板只指定了"image": "mcr.microsoft.com/devcontainers/python:0-3.11"
-但当然我的VM运行的是完整的操作系统,而不仅仅是python。这是否意味着默认情况下它会下载例如ubuntu和 then 将python镜像添加到容器中?
不管怎样,我得把巴泽尔加进去。IIUC,最好的方法是使用features,据我所知,这是要添加到主图像的附加图像。然而,bazel功能似乎已被弃用,目前不可用。
所以我可能需要use a Dockerfile来设置我的devcontainer。我想这次我应该从ubuntu基础镜像开始,而不是从python3.11镜像开始。
不管怎样,如何在dockerfiles中添加install bazel(和buildifier)呢?理论上,我可以遵循bazel安装说明(目前包括下载和运行bazel-6.0.0-installer-linux-x86_64.sh脚本,为bazel和buildifier设置env vars等)。
这听起来像一个痛苦。另一方面,在gcr.io/bazel-public/bazel上有一个官方的bazel镜像,所以理想情况下我只使用那个。有没有一种方法可以简单地将Docker镜像添加到我的容器中?我已经找到了使用docker compose的建议,但坦率地说,在这一点上,我不知道发生了什么。
有人能推荐一种最简单的方法来从基本的ubuntu镜像安装bazel / buildifier / fix系统路径,作为github代码空间开发的起点吗?
谢谢你!
1条答案
按热度按时间axr492tv1#
我知道这已经是几个月前的事了,但为了别人的面子;
这是否意味着默认情况下它会下载例如ubuntu,然后将python镜像添加到容器中?
你可以在这里找到标准devcontainers的源代码:https://github.com/devcontainers/images。在python镜像的例子中,它实际上是以python开始的,而python又是在Debian 12上构建的(即书虫):
所以我可能需要使用Dockerfile来设置我的devcontainer。我想这次我应该从ubuntu基础镜像开始,而不是从python3.11镜像开始。
与标准基础映像一样,从python映像开始就可以了。虽然
universal
devcontainer镜像使用Ubuntu,但大多数更具体的镜像往往只是Debian。选择基于debian的发行版是最安全的,特别是如果你要安装其他功能的话。只需要确保将
ghcr.io/devcontainers/features/common-utils:2
特性添加到devcontainer.json
文件中。您甚至可以从将definition of of the standard python image复制到存储库中开始,并根据需要对其进行修改(例如在Dockerfile
中安装bazel)。或者,您可以从自己的
devcontainer.json
和Dockerfile
开始,其中Dockerfile
从FROM mcr.microsoft.com/devcontainers/python:0-3.11
开始。该映像中的devcontainer.json
作为元数据包含在构建的映像中,因此在构建自定义映像时,devcontainers会知道该基础映像的配置。使用自定义devcontainer时,您首先会注意到代码空间的创建时间大大增加。你可以通过使用预构建来解决这个问题。如果您有多个将使用相同基础映像的存储库,则可以在其自己的存储库中构建映像,然后将该映像部署到容器注册表(例如dockerhub或ghcr.io),然后在代码空间存储库的
devcontainer.json
中引用该图像,就像使用标准python图像一样。