docker - 在容器内创建容器会引发错误“docker: not found”
问题描述
我正在自动化从简单的 ML 模型创建 Docker 映像的过程。到目前为止,我在一个烧瓶中成功地完成了它,我调用的是在 Linux 中运行的,并且具有从模型创建新容器的模板。
现在下一步如果要容器化此 API,我尝试创建容器并
调用 API,但我收到此错误:
"docker: not found"
所以基本上,docker容器没有安装docker,因此我不能从那里创建新图像。
我想在那里安装 Docker 并找到一些资源来做到这一点: https ://github.com/jpetazzo/dind 但长话短说:这是个坏主意。
从另一个博客,我发现了这个:http: //jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
“你真的想要 Docker-in-Docker?或者你只是希望能够从你的 CI 系统运行 Docker(特别是:构建、运行,有时推送容器和镜像),而这个 CI 系统本身就在一个容器中? "
这似乎是我的问题的解决方案,博客建议使用音量标志来暴露套接字:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
我做了:
sudo docker run -v /var/run/docker.sock:/var/run/docker.sock -d -p 5100:5100 my_container:latest
但之后我得到了完全相同的错误:“docker:not found”。
解决方案
最好使用官方的 Docker dind,而不是使用它作为jpetazzo/dind,它从去年开始没有更新。
启动守护程序实例
$ docker run --privileged --name some-docker -d \
--network some-network --network-alias docker \
-e DOCKER_TLS_CERTDIR=/certs \
-v some-docker-certs-ca:/certs/ca \
-v some-docker-certs-client:/certs/client \
docker:dind
如果您有兴趣添加一些自己的二进制文件,那么
From docker:dind
# add here and create your own image
TLS
从 18.09+ 开始,此映像的 dind 变体将在 DOCKER_TLS_CERTDIR 环境变量指定的目录中自动生成 TLS 证书。
您可以在此处进一步阅读有关官方 dind 图像的更多信息
数据存储:
Docker 文档是了解不同存储选项和变体的良好起点,并且有多个博客和论坛帖子在该领域讨论和提供建议。我们将在这里简单地展示上面后一个选项的基本过程:
在主机系统上的合适卷上创建数据目录,例如 /my/own/var-lib-docker。
像这样启动你的 docker 容器:
$ docker run --privileged --name some-docker -v /my/own/var-lib-docker:/var/lib/docker -d docker:dind
该-v /my/own/var-lib-docker:/var/lib/docker
命令的一部分/my/own/var-lib-docker
将底层主机系统中的目录挂载/var/lib/docker
到容器内部,Docker 默认将在容器中写入其数据文件。
推荐阅读
- javascript - 我在 javascript 中的 innerHTML 分配命令不会自动更新 ui
- powershell - 从 Windows 10 命令提示符运行 PS1
- iframe - Google Docs 嵌入式视图未加载某些字体
- javascript - 如何在 localhost 窗口的 iframe 中设置/允许 cookie
- python - 从 Pandas Data Frame 计算一段时间内的历史平均值
- lua - 尝试将 IUP 与 Lua 一起使用,但未找到模块“iuplua”
- simulation - 动态资源集分配 Anylogic
- informatica - 连接器转换缓存在 informatica 中的工作原理
- php - Laravel Cache:多个 Redis 驱动程序点击同一个键,需要时间
- linux - 已安装 sdk 时如何解决 dotnet core 运行时丢失错误