| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- import { spawnSync } from 'node:child_process'
- import { readFileSync } from 'node:fs'
- import { resolve } from 'node:path'
- const packageJson = JSON.parse(readFileSync(resolve('package.json'), 'utf8'))
- const image = process.env.DOCKER_IMAGE || 'flyfishdev/file-viewer'
- const isPush = process.argv.includes('--push')
- const isLoad = process.argv.includes('--load') || !isPush
- const hostArch = process.arch === 'arm64' ? 'arm64' : 'amd64'
- const platforms = process.env.DOCKER_PLATFORMS || (isPush ? 'linux/amd64,linux/arm64' : `linux/${hostArch}`)
- const builderName = process.env.DOCKER_BUILDER || 'flyfish-viewer-builder'
- const tagList = (process.env.DOCKER_TAGS || `${packageJson.version},latest`)
- .split(',')
- .map(tag => tag.trim())
- .filter(Boolean)
- const runDocker = (args, options = {}) => {
- const result = spawnSync('docker', args, {
- stdio: options.stdio || 'inherit',
- env: process.env
- })
- return result.status || 0
- }
- if (isPush) {
- const hasBuilder = runDocker(['buildx', 'inspect', builderName], { stdio: 'ignore' }) === 0
- if (!hasBuilder) {
- const createStatus = runDocker([
- 'buildx',
- 'create',
- '--name',
- builderName,
- '--driver',
- 'docker-container'
- ])
- if (createStatus !== 0) {
- process.exit(createStatus)
- }
- }
- const bootstrapStatus = runDocker(['buildx', 'inspect', builderName, '--bootstrap'])
- if (bootstrapStatus !== 0) {
- process.exit(bootstrapStatus)
- }
- }
- const args = [
- 'buildx',
- 'build',
- ...(isPush ? ['--builder', builderName] : []),
- '--platform',
- platforms,
- '--build-arg',
- `APP_VERSION=${packageJson.version}`
- ]
- for (const tag of tagList) {
- args.push('-t', `${image}:${tag}`)
- }
- args.push(isPush ? '--push' : '--load')
- args.push('.')
- console.log(`[docker] image=${image}`)
- console.log(`[docker] tags=${tagList.join(', ')}`)
- console.log(`[docker] platforms=${platforms}`)
- console.log(`[docker] mode=${isPush ? 'push' : 'load'}`)
- if (isPush) {
- console.log(`[docker] builder=${builderName}`)
- }
- const result = spawnSync('docker', args, { stdio: 'inherit', env: process.env })
- if (result.status !== 0) {
- process.exit(result.status || 1)
- }
|