linux - Docker(Linux)错误:即使我有足够的空间,设备上也没有剩余空间
问题描述
我已经构建了 docker 映像,而我得到了Error: no space left on device。这出现在 docker 复制 oracle 数据库文件的步骤中。在我的 docker 文件中是这一步:
ADD resources/oracle/database /data/home/oracle/database/
RUN chown -R oracle:oracle /data/home/oracle/database
当我构建图像之后,此步骤需要一些时间,然后它会打印此错误:
Step 10/32 : ADD resources/tomcat/apache-tomcat-8.0.29.tar.gz /opt/tomcat
---> 092e001b744e
Step 11/32 : ADD resources/oracle/database /data/home/oracle/database/
---> 69218d6278b0
Step 12/32 : RUN chown -R oracle:oracle /data/home/oracle/database
---> Running in 4ae797185eeb
Error processing tar file(exit status 1): write /data/home/oracle/database/javavm/jdk/jdk8/admin/classes.bin: no space left on device
嗯,在我看来,我在 linux 服务器上没有足够的空间。然后我尝试检查我在 linux 中的空间,因为我确信我有很多空间。我运行 df -h 它看起来像这样:
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 59G 0 59G 0% /dev
tmpfs 59G 0 59G 0% /dev/shm
tmpfs 59G 418M 59G 1% /run
tmpfs 59G 0 59G 0% /sys/fs/cgroup
/dev/sda3 39G 30G 9.0G 77% /
/dev/sda1 200M 8.6M 192M 5% /boot/efi
tmpfs 12G 0 12G 0% /run/user/1000
/dev/sdc 1008G 176G 781G 19% /data
/dev/sdd 1008G 466G 492G 49% /oracle
tmpfs 12G 0 12G 0% /run/user/2003
在我构建图像之前,它看起来像这样:
davinci@sii-dev-ora19:/opt/davinci]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 59G 0 59G 0% /dev
tmpfs 59G 0 59G 0% /dev/shm
tmpfs 59G 418M 59G 1% /run
tmpfs 59G 0 59G 0% /sys/fs/cgroup
/dev/sda3 39G 16G 23G 42% /
/dev/sda1 200M 8.6M 192M 5% /boot/efi
tmpfs 12G 0 12G 0% /run/user/1000
/dev/sdc 1008G 176G 781G 19% /data
/dev/sdd 1008G 466G 492G 49% /oracle
tmpfs 12G 0 12G 0% /run/user/2003
意味着我在构建映像之前在 /dev/sda3 上有 23GB 可用,而在构建映像之后只有 9GB 可用。
问题1:为什么即使我在那个分区上还有 9GB 可用,它也会停止? 问题2: docker 似乎没有从其他分区中占用空间。例如,在 dev/sdc 上,我有 718GB 可用空间。如何告诉 docker 从那里占用空间? 问题3:似乎docker将文件写入这个文件夹/data/home/oracle/database/...但是我用winscp去那个文件夹我只能找到目录/data。容器中的文件夹 /data/home/oracle/database/ 是某种方式还是它真的在 linux 文件系统中?
解决方案
问题1:为什么即使我在那个分区上还有 9GB 可用,它也会停止?
发生错误时您没有。该错误导致 docker 删除了它创建的部分文件系统层。注意覆盖文件系统,递归 chmod 将复制该目录树中的每个文件,使已用磁盘空间翻倍。
df -i
请注意,当您收到此写入 ( )时,您还应该注意 inode 耗尽。
问题2: docker 似乎没有从其他分区中占用空间。例如,在 dev/sdc 上,我有 718GB 可用空间。如何告诉 docker 从那里占用空间?
Docker 将数据存储在/var/lib/docker
. 我建议将其设为自己的分区,或者使用符号链接重新定位它,而不是尝试更改 docker 的位置。有很多工具假设这个目录名称。
问题3:似乎docker将文件写入这个文件夹/data/home/oracle/database/...但是我用winscp去那个文件夹我只能找到目录/data。容器中的文件夹 /data/home/oracle/database/ 是某种方式还是它真的在 linux 文件系统中?
Docker 使用命名空间,以及文件系统中的命名空间之一。docker 容器中的根目录不是主机上的根目录,否则您将没有隔离。这通常实现为 docker 目录下的覆盖文件系统,并且 Dockerfile 的每一步都可能创建一个新的文件系统层,供覆盖层使用。
推荐阅读
- reactjs - 反应导航 getParam 没有导航道具
- python - 当我运行 exe 时,我得到 No module named 'PyQt5' 但从脚本中它的工作
- xcode - 使用 Mac Catalyst 上传新应用程序版本时出错
- tensorflow - 如何解决“没有算法工作”的 Keras 错误?
- haskell - 遍历 Haskell 中的 2 个列表
- javascript - 如何在 React 中检查函数或组件的返回值?
- python - Python 3.8 TLSv1.3 套接字关闭导致 ConnectionResetError 或 ConnectionAbortedError
- c# - WPF:尝试根据组合框中的选择更改可见性
- python - 删除日期时间值的一部分?
- ruby-on-rails - Rails 5.2.x,从 CDN 更新为 FontAwesome 套件 - 我需要向我的 CSP 添加什么以允许 css 和字体?