从图像创建Docker容器而不启动它

Mar*_*utz 9 docker

作为我的部署策略的一部分,我使用Upstart管理Docker容器.

为此,我需要从注册表中提取图像并创建一个命名容器(如Upstart脚本中建议的那样,运行容器将无法管理生命周期)

有没有办法在没有首先运行图像的情况下创建容器?我不想要启动容器(可能会引入副作用),停止它,然后在其他地方管理.

例如,类似于:

docker.io create -e ENV1=a -e ENV2=b -p 80:80 --name my_first_container sample/containe
Run Code Online (Sandbox Code Playgroud)

Adr*_*uat 21

如果其他人遇到这个问题,现在可以使用该docker create命令完成.请参阅https://docs.docker.com/engine/reference/commandline/create/


小智 3

您可以使用Docker Remote API来实现这一点。

首先调整docker守护进程的运行方式。除了默认的 unix 套接字之外,将其配置为侦听端口 4243 上的 HTTP 请求:

sudo sh -c "echo 'DOCKER_OPTS=\"-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock\"' > /etc/default/docker"
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用/containers/create端点创建容器而不运行它:

curl -X POST -H "Content-Type: application/json" http://localhost:4243/containers/create?name=my_first_container -d '
{
    "Name": "dtest2",
    "AttachStdin": "false",
    "AttachStdout": "false",
    "AttachStderr": "false",
    "Tty": "false",
    "OpenStdin": "false",
    "StdinOnce": "false",
    "Cmd":["/bin/bash", "-c", "echo Starting;sleep 20;echo Stopping"],
    "Image": "ubuntu",
    "DisableNetwork": "false"
}
'
Run Code Online (Sandbox Code Playgroud)

注意?name=my_first_container我在curl请求url中添加的参数。这就是您为容器命名的方式。

旁注- 无需添加 HTTP 接口也可以实现相同的效果,但是使用简单的curl POST 请求来显示解决方案似乎更容易。