从头开始创建一个没有任何入口点的新图像



我正在尝试创建一个只有很多配置文件的映像。我想我会从头开始创建一个映像,然后将所有文件复制到一个目录中。在启动容器时,我将使用mount装载一个卷,然后所有不同的容器都可以使用该卷来获取配置。

这是我的Dockerfile

FROM scratch
ADD configurations /configurations

这是docker运行命令

docker run --mount source=config,target=/configurations $image

当我试图启动我得到的图像时来自守护进程的错误响应:oci运行时错误:container_linux.go:247:启动容器进程导致"exec:":在$PATH中找不到可执行文件。

是否可以让容器不带任何入口点命令?

容器是流程的包装器。当进程退出时,容器退出。当你不能启动这个过程时,你就不能启动容器。

如果你想把一些文件装载到容器中,那么你只需要在主机上有一个目录。制作一个命名卷并用您的文件填充它。然后将命名的卷装入容器中。这里有一个从linux中的本地目录(data_dir((或其他平台上的bash-shell(填充命名卷(此处称为vol_name(的单行:

tar -cC data_dir . | docker run -i --rm -v vol_name:/target busybox tar -xC /target

简单地说,没有

容器需要ENTRYPOINTCMD。它需要一些操作,否则它将退出。

scratch的情况下,没有什么可运行的,因此您需要将自己的二进制文件添加到容器中。可以在此处找到有关此操作的有用指南:https://embano1.github.io/post/scratch/.

否则,如果大小不重要,最简单的方法就是拍摄一张小的基本图像,比如alpine,然后在Dockerfile:的末尾添加一个睡眠

FROM alpine
ADD yourstuff
CMD ["/bin/sh", "-c", "while true; do sleep 60; done"]

注意,之所以使用while循环,是因为alpine不理解sleep infinity

不过,我支持上面的评论。您最好安装一个包含配置文件的卷。这样做有点像黑客,而且很难看。

您试图做的事情被称为data only container您可以通过dockerfile 将volume from装载到您的容器中

但如前所述,您应该只创建一个包含数据的本地卷并将该卷装载到每个需要访问文件的容器中。

https://docs.docker.com/storage/volumes/

最新更新