Bash:在后台安装多个 npm 会出错,'No space left on device'



我正在谷歌云计算机器上设置Docker,1个vCPU和3.75 GB ram。

如果我只是运行docker-compose up --build,它确实有效,但该过程是连续且缓慢的。所以我正在使用这个 bash 脚本,以便我可以在后台构建图像,并跳过通常的顺序过程。

command=$1
shift
jobsList=""
taskList[0]=""
i=0
#Replaces all the fluff with nothing, and we get our job Id
function getJobId(){
  echo "$(echo $STRING | sed s/^[^0-9]*// | sed s/[^0-9].*$//)"
}

for task in "$@"
do
  echo "Command is $command $task"
  docker-compose $command $task &> ${task}.text &
  lastJob=`getJobId $(jobs %%)`
  jobsList="$jobsList $lastJob"
  echo "jobsList is $jobsList"
  taskList[$i]="$command $task"
  i=$(($i + 1))
done
i=0
for job in $jobsList
do
  wait %$job
  echo "${taskList[$i]} completed with status $?"
  i=$(($i + 1))
done

我以下列方式使用它:

availableServices=$(docker-compose config --services)
while IFS='' read -r line || [[ -n "$line" ]]
do
  services+=$(echo "$line ")
done <<<"$availableServices"
./runInParallel.sh build $services

我在docker-compose.yml中将可用的服务串在一起,并将其传递给我的脚本。

但问题是最终所有进程都失败并显示以下错误:

npm WARN tar ENOSPC: no space left on device, write
Unhandled rejection Error: ENOSPC: no space left on device, write

我检查了inode,/dev/sda1只使用了44%。

这是我对命令df -h的输出:

Filesystem      Size  Used Avail Use% Mounted on
udev            1.8G     0  1.8G   0% /dev
tmpfs           370M  892K  369M   1% /run
/dev/sda1       9.6G  9.1G  455M  96% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/loop0       55M   55M     0 100% /snap/google-cloud-sdk/64
/dev/loop2       55M   55M     0 100% /snap/google-cloud-sdk/62
/dev/loop1       55M   55M     0 100% /snap/google-cloud-sdk/63
/dev/loop3       79M   79M     0 100% /snap/go/3095
/dev/loop5       89M   89M     0 100% /snap/core/5897
/dev/loop4       90M   90M     0 100% /snap/core/6130
/dev/loop6       90M   90M     0 100% /snap/core/6034
/dev/sda15      105M  3.6M  101M   4% /boot/efi
tmpfs           370M     0  370M   0% /run/user/1001

这是df -i的输出

Filesystem      Inodes  IUsed  IFree IUse% Mounted on
udev            469499    385 469114    1% /dev
tmpfs           472727    592 472135    1% /run
/dev/sda1      1290240 636907 653333   50% /
tmpfs           472727      1 472726    1% /dev/shm
tmpfs           472727      8 472719    1% /run/lock
tmpfs           472727     18 472709    1% /sys/fs/cgroup
/dev/loop0       20782  20782      0  100% /snap/google-cloud-sdk/64
/dev/loop2       20680  20680      0  100% /snap/google-cloud-sdk/62
/dev/loop1       20738  20738      0  100% /snap/google-cloud-sdk/63
/dev/loop3        9417   9417      0  100% /snap/go/3095
/dev/loop5       12808  12808      0  100% /snap/core/5897
/dev/loop4       12810  12810      0  100% /snap/core/6130
/dev/loop6       12810  12810      0  100% /snap/core/6034
/dev/sda15           0      0      0     - /boot/efi
tmpfs           472727     10 472717    1% /run/user/1001

df -h输出来看,根目录 (/dev/sda1) 只有 455MB 的可用空间。

每当您运行 docker build 时,docker-client (CLI) 都会将 Dockerfile 目录的所有内容发送到构建映像的 docker-daemon。

因此,例如,如果您有三个服务,每个服务都有 300MB 的目录,则可以使用 455MB 的可用空间按顺序构建它们,但要同时构建它们,您需要 300MB*3 的可用空间量供 docker-daemon 缓存和构建映像。