有两个容器A和B.一旦容器A启动,将执行一个进程,然后容器将停止。容器B只是一个Web应用程序(比如expressjs)。是否可以从容器B中启动A?
答案 0 :(得分:20)
可以授予容器访问docker的权限,以便它可以在您的主机上生成其他容器。你可以通过在容器中暴露docker socket来实现这一点,例如:
docker run -v /var/run/docker.sock:/var/run/docker.sock --name containerB myimage ...
现在,如果容器中有docker
客户端,您将能够控制主机上的docker守护程序并使用它来生成“容器A”。
在尝试此方法之前,您应该了解安全注意事项:访问docker与在主机上访问root
相同,这意味着如果您的Web应用程序有远程攻击,那么您刚刚交付主机给攻击者的钥匙。这将更全面地描述in this article。
答案 1 :(得分:8)
可以安装泊坞插座。
容器A
它会将时间打印到stdout(及其日志)并退出。
docker run --name contA ubuntu date
容器B
诀窍是挂载主机的docker socket,然后在容器上安装docker客户端。然后它将与守护进程交互,就像您使用主机中的docker一样。安装docker后,它只需每5秒重启一次容器A.
docker run --name contB -v /var/run/docker.sock:/var/run/docker.sock ubuntu bash -c "
apt-get update && apt-get install -y curl &&
curl -sSL https://get.docker.com/ | sh &&
watch --interval 5 docker restart contA"
你可以看到通过查看日志来调用contA
docker logs contA
也就是说,Docker真正意味着长期运行的服务。在Docker github上有一些关于为维护,cron作业等指定短期“工作”服务的问题,但没有任何决定,更不用说编码了。因此,最好建立您的系统,以便容器能够保持运转状态。
答案 2 :(得分:0)
docker-compose.yml
(对幼虫的抵用额)
# ...
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# ...
Dockerfile
(归功于亚伦五世)
# ...
ENV DOCKERVERSION=19.03.12
RUN curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKERVERSION}.tgz \
&& tar xzvf docker-${DOCKERVERSION}.tgz --strip 1 -C /usr/local/bin docker/docker \
&& rm docker-${DOCKERVERSION}.tgz
# ...
Node.js index.js
(归功于Arpan Abhishek,Maulik Parmar和anishsane)
# ...
const { exec } = require("child_process");
# ...
exec('docker container ls -a --format "table {{.ID}}\t{{.Names}}" | grep <PART_OF_YOUR_CONTAINER_NAME> | cut -d" " -f1 | cut -f1 | xargs -I{} docker container restart -t 0 {}', (error, stdout, stderr) => {
if (error) {
console.log(`error: ${error.message}`);
return;
}
if (stderr) {
console.log(`stderr: ${stderr}`);
return;
}
console.log(`stdout: ${stdout}`);
});
# ...
docker.sock
是一件安全的事情。<PART_OF_YOUR_CONTAINER_NAME>
。