docker-buildx.mjs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { spawnSync } from 'node:child_process'
  2. import { readFileSync } from 'node:fs'
  3. import { resolve } from 'node:path'
  4. const packageJson = JSON.parse(readFileSync(resolve('package.json'), 'utf8'))
  5. const image = process.env.DOCKER_IMAGE || 'flyfishdev/file-viewer'
  6. const isPush = process.argv.includes('--push')
  7. const isLoad = process.argv.includes('--load') || !isPush
  8. const hostArch = process.arch === 'arm64' ? 'arm64' : 'amd64'
  9. const platforms = process.env.DOCKER_PLATFORMS || (isPush ? 'linux/amd64,linux/arm64' : `linux/${hostArch}`)
  10. const builderName = process.env.DOCKER_BUILDER || 'flyfish-viewer-builder'
  11. const tagList = (process.env.DOCKER_TAGS || `${packageJson.version},latest`)
  12. .split(',')
  13. .map(tag => tag.trim())
  14. .filter(Boolean)
  15. const runDocker = (args, options = {}) => {
  16. const result = spawnSync('docker', args, {
  17. stdio: options.stdio || 'inherit',
  18. env: process.env
  19. })
  20. return result.status || 0
  21. }
  22. if (isPush) {
  23. const hasBuilder = runDocker(['buildx', 'inspect', builderName], { stdio: 'ignore' }) === 0
  24. if (!hasBuilder) {
  25. const createStatus = runDocker([
  26. 'buildx',
  27. 'create',
  28. '--name',
  29. builderName,
  30. '--driver',
  31. 'docker-container'
  32. ])
  33. if (createStatus !== 0) {
  34. process.exit(createStatus)
  35. }
  36. }
  37. const bootstrapStatus = runDocker(['buildx', 'inspect', builderName, '--bootstrap'])
  38. if (bootstrapStatus !== 0) {
  39. process.exit(bootstrapStatus)
  40. }
  41. }
  42. const args = [
  43. 'buildx',
  44. 'build',
  45. ...(isPush ? ['--builder', builderName] : []),
  46. '--platform',
  47. platforms,
  48. '--build-arg',
  49. `APP_VERSION=${packageJson.version}`
  50. ]
  51. for (const tag of tagList) {
  52. args.push('-t', `${image}:${tag}`)
  53. }
  54. args.push(isPush ? '--push' : '--load')
  55. args.push('.')
  56. console.log(`[docker] image=${image}`)
  57. console.log(`[docker] tags=${tagList.join(', ')}`)
  58. console.log(`[docker] platforms=${platforms}`)
  59. console.log(`[docker] mode=${isPush ? 'push' : 'load'}`)
  60. if (isPush) {
  61. console.log(`[docker] builder=${builderName}`)
  62. }
  63. const result = spawnSync('docker', args, { stdio: 'inherit', env: process.env })
  64. if (result.status !== 0) {
  65. process.exit(result.status || 1)
  66. }