我在 Docker/Fig 环境中看到一个奇怪的问题。我的假设是,这是由于将卷安装到容器的延迟造成的,但我不确定如何确认这一点。
我有一个包含以下内容的容器:
Dockerfile
FROM busybox
MAINTAINER Dan Rumney <email>
ADD loadsnapshot.sh /loadsnapshot.sh
RUN ["chmod", "u+x", "/loadsnapshot.sh"]
VOLUME ["/snapshot"]
ENTRYPOINT ["/loadsnapshot.sh"]
加载快照.sh
#!/bin/sh
if [ "$( ls -A /snapshot)" ]; then
echo "Loading snapshot..."
# Do stuff
else
echo "No snapshot to load"
fi
在我的Fig.yml 文件中,我有:
pdsvol:
image: busybox
volumes:
- "/opt/alfresco/alf_data"
- "/data"
- "/mysqlbackup"
- "/ldapbackup"
loader:
image: "docker.myregistry.com/snapshot.loader:3.5.0"
volumes_from:
- pdsvol
volumes:
- "/opt/snapshots/my-data/:/snapshot/"
这里的目标(可能是显而易见的)是启动一个数据容器(pdsvol
),然后用我的机器上运行的一些数据填充它。pdsvol
然后由一堆其他容器共享。
我运行这个的方式是调用
fig up pdsvol
and then
fig run --rm loader
我期望看到的是
builder@beast:/opt/docker-vm$ fig run --rm loader
Loading snapshot...
... stuff ...
Removing dockervm_loader_run_1...
而且,有时我会这样做。然而,有时我会看到:
builder@beast:/opt/docker-vm$ fig run --rm loader
No snapshot to load
Removing dockervm_loader_run_1...
我可以跑fig run --rm loader
一遍又一遍,我会得到两个结果之一。
我的工作理论是,安装卷时存在一些延迟,有时它发生在安装之前ENTRYPOINT
脚本会运行,有时会在之后运行。但是,如果我运行:
docker run --rm -v /opt/snapshots/my-data/:/snapshot/ busybox ls -A /snapshot
我一直看到我期待的文件......所以这违背了这个理论。
我知道我可以破解loadsnapshot.sh
并延迟一下,看看是否有帮助,但我宁愿了解发生了什么,也不愿拼凑解决方案。
有人知道这里发生了什么吗?
顺便说一句:主机系统是 Linux,所以我们在这里使用本机容器。
Update
我尝试在顶部添加 2 秒延迟loadsnapshot.sh
,但这并没有帮助。
Update 2
我向Fig 添加了一些日志记录以转储用于创建容器的配置,并且在每个实例中(失败或失败),它都是相同的:
{
'Env': None,
'Hostname': None,
'Entrypoint': None,
'Dns': None,
'Memory': 0,
'OpenStdin': True,
'User': None,
'CpuShares': None,
'AttachStdout': True,
'NetworkDisabled': False,
'WorkingDir': None,
'Cmd': None,
'StdinOnce': True,
'AttachStdin': True,
'Volumes': {u'/snapshot/': {}},
'MemorySwap': 0,
'VolumesFrom': None,
'Tty': True,
'AttachStderr': True,
'Domainname': None,
'Image': 'docker.myregistry.com/snapshot.loader:3.5.0',
'ExposedPorts': None
}