Docker容器在启动时无法启动

4
我正在运行一个EC2实例,并使用启动脚本在重新启动时调用。这个启动脚本会检查Docker守护进程是否正在运行,然后再启动容器,但是出现了以下错误: Post http:///var/run/docker.sock/v1.13/containers/create: dial unix /var/run/docker.sock: no such file or directory 启动脚本
# Make sure the docker daemon has started
sudo /usr/sbin/service docker start

# start the container
sudo /usr/bin/docker run -d 91b5261e2dc0

请注意,这是在一个不需要输入密码即可使用“sudo”的EC2实例上。 Crontab条目:
@reboot /bin/bash /home/ubuntu/start-container.sh 2> /home/ubuntu/cron_errors.log

错误信息:

start: Job is already running: docker
2014/08/01 09:45:48 Post http:///var/run/docker.sock/v1.13/containers/create: dial unix /var/run/docker.sock: no such file or directory

每当我手动运行启动脚本时,它都能完美运行,这让我觉得可能是环境变量/路径的问题。在网上搜索时发现有关未设置 DOCKER_HOST 的信息,但即使 DOCKER_HOST 仍未设置,启动脚本也能正常工作。
我需要更改或定义哪些内容以确保容器在启动时正确运行?
版本信息:
操作系统:Ubuntu 14.04 硬件虚拟化。
Docker 版本:
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070

uname -a 输出

Linux ip-10-76-167-92 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

尝试在start-container.sh的第一条命令后面添加一个wait命令(或者&&),如果不行,你确定你的cron工作是以root权限运行的吗?尝试使用@reboot root /bin/bash start-container.sh ... - Chris McKinnel
添加一个 sleep 10 暂时“修复”了问题,但我宁愿不要依赖竞争条件。我没有以 root 身份运行,而是使用默认的“ubuntu”用户,因此需要调用 sudo。 - Programster
没关系,至少现在你知道 Docker 守护进程没有及时启动容器。那么,在启动命令的末尾使用 && 怎么样?你实际上是在说“当 Docker 守护进程启动完成后,启动容器”。基本上与等待是一样的。 - Chris McKinnel
@Chris McKinnel,您是在说我的sudo /usr/sbin/service docker start命令是非阻塞的,它会立即转到下一行:sudo /usr/bin/docker run -d 91b5261e2dc0,而守护程序还没有完成启动吗? - Programster
1
如果你查看/etc/init.d/docker文件,你会发现调用start命令时使用了--background选项来启动start-stop-daemon,这意味着它在返回时仍在执行一些操作。 - Chris McKinnel
我担心像 sudo /usr/sbin/service "docker" "start" && /usr/bin/docker run -d [IMAGE ID] 这样的命令似乎从来没有运行第二部分。我猜想这是因为 && 只有在前一个命令成功并且 docker 服务已经在运行时才被认为是成功的? - Programster
3个回答

4
“解决方案”是在调用启动docker守护进程后加入一个sleep或wait。例如:
# Make sure the docker daemon has started
sudo /usr/sbin/service docker start

# Wait for the docker daemon to finish starting
sleep 10

# start the container
sudo /usr/bin/docker run -d 91b5261e2dc0

这似乎是因为正如Chris McKinnel所说的那样:
“...如果您查看/ etc / init.d / docker内部,您将看到调用start使用--background选项来启动-stop-daemon,这意味着它在返回时仍在执行操作。”
为什么不只使用&&?
我尝试使用&&来排队启动容器,以在调用启动docker守护程序后启动容器,但是&&仅在前者成功时才运行下一个命令,这并不总是情况(例如,如果docker守护程序已经在运行)。[ref]

3
另一种解决方案可能是手动运行该容器,并使用--restart=always选项:
```另一种解决方案可能是手动运行该容器,并使用--restart=always选项:```
docker run --restart=always -d 91b5261e2dc0    

在使用docker start命令启动时,docker将启动所有这样的容器,如果容器没有使用docker stop命令停止,则会一直运行。


1
您可以在运行容器之前等待Docker套接字可用:
# Start the docker daemon
sudo /usr/sbin/service docker start

# Wait for docker socket to become available
while [ ! -e /var/run/docker.sock ]; do sleep 1; done

# start the container
sudo /usr/bin/docker run -d 91b5261e2dc0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接