@@ -54,6 +54,7 @@ import { getOceanTokenAddressForChain } from '../../utils/address.js'
5454import { dockerRegistrysAuth , dockerRegistryAuth } from '../../@types/OceanNode.js'
5555import { EncryptMethod } from '../../@types/fileObject.js'
5656import { ZeroAddress } from 'ethers'
57+ import { chmodSync } from 'node:fs'
5758
5859const C2D_CONTAINER_UID = 1000
5960const C2D_CONTAINER_GID = 1000
@@ -1519,58 +1520,58 @@ export class C2DEngineDocker extends C2DEngine {
15191520 }
15201521 }
15211522
1522- private async ensureImage ( image : string ) : Promise < void > {
1523- try {
1524- await this . docker . getImage ( image ) . inspect ( )
1525- } catch {
1526- CORE_LOGGER . info ( `Image ${ image } not found locally, pulling...` )
1527- const pullStream = await this . docker . pull ( image )
1528- await new Promise < void > ( ( resolve , reject ) => {
1529- this . docker . modem . followProgress ( pullStream , ( err : any ) => {
1530- if ( err ) reject ( err )
1531- else resolve ( )
1532- } )
1533- } )
1534- }
1535- }
1536-
1537- private async initializeVolumePermissions ( volumeName : string ) : Promise < boolean > {
1538- let initContainer : Dockerode . Container | null = null
1539- try {
1540- await this . ensureImage ( 'busybox' )
1541- initContainer = await this . docker . createContainer ( {
1542- Image : 'busybox' ,
1543- Cmd : [
1544- 'sh' ,
1545- '-c' ,
1546- 'mkdir -p /data/inputs /data/outputs /data/transformations /data/ddos /data/logs && chmod 777 /data /data/inputs /data/outputs /data/transformations /data/ddos /data/logs'
1547- ] ,
1548- HostConfig : {
1549- NetworkMode : 'none' ,
1550- Mounts : [ { Type : 'volume' , Source : volumeName , Target : '/data' } ]
1551- }
1552- } )
1553- await initContainer . start ( )
1554- const { StatusCode } = await initContainer . wait ( )
1555- if ( StatusCode !== 0 ) {
1556- CORE_LOGGER . error (
1557- `Volume permission init container exited with code ${ StatusCode } for volume ${ volumeName } `
1558- )
1559- return false
1560- }
1561- CORE_LOGGER . info ( `Volume permissions initialized successfully for ${ volumeName } ` )
1562- return true
1563- } catch ( e ) {
1564- CORE_LOGGER . error ( `Failed to initialize volume permissions: ${ e . message } ` )
1565- return false
1566- } finally {
1567- if ( initContainer ) {
1568- try {
1569- await initContainer . remove ( )
1570- } catch { }
1571- }
1572- }
1573- }
1523+ // private async ensureImage(image: string): Promise<void> {
1524+ // try {
1525+ // await this.docker.getImage(image).inspect()
1526+ // } catch {
1527+ // CORE_LOGGER.info(`Image ${image} not found locally, pulling...`)
1528+ // const pullStream = await this.docker.pull(image)
1529+ // await new Promise<void>((resolve, reject) => {
1530+ // this.docker.modem.followProgress(pullStream, (err: any) => {
1531+ // if (err) reject(err)
1532+ // else resolve()
1533+ // })
1534+ // })
1535+ // }
1536+ // }
1537+
1538+ // private async initializeVolumePermissions(volumeName: string): Promise<boolean> {
1539+ // let initContainer: Dockerode.Container | null = null
1540+ // try {
1541+ // await this.ensureImage('busybox')
1542+ // initContainer = await this.docker.createContainer({
1543+ // Image: 'busybox',
1544+ // Cmd: [
1545+ // 'sh',
1546+ // '-c',
1547+ // 'mkdir -p /data/inputs /data/outputs /data/transformations /data/ddos /data/logs && chmod 777 /data /data/inputs /data/outputs /data/transformations /data/ddos /data/logs'
1548+ // ],
1549+ // HostConfig: {
1550+ // NetworkMode: 'none',
1551+ // Mounts: [{ Type: 'volume', Source: volumeName, Target: '/data' }]
1552+ // }
1553+ // })
1554+ // await initContainer.start()
1555+ // const { StatusCode } = await initContainer.wait()
1556+ // if (StatusCode !== 0) {
1557+ // CORE_LOGGER.error(
1558+ // `Volume permission init container exited with code ${StatusCode} for volume ${volumeName}`
1559+ // )
1560+ // return false
1561+ // }
1562+ // CORE_LOGGER.info(`Volume permissions initialized successfully for ${volumeName}`)
1563+ // return true
1564+ // } catch (e) {
1565+ // CORE_LOGGER.error(`Failed to initialize volume permissions: ${e.message}`)
1566+ // return false
1567+ // } finally {
1568+ // if (initContainer) {
1569+ // try {
1570+ // await initContainer.remove()
1571+ // } catch {}
1572+ // }
1573+ // }
1574+ // }
15741575
15751576 private async createDockerVolume (
15761577 volume : VolumeCreateOptions ,
@@ -1688,15 +1689,15 @@ export class C2DEngineDocker extends C2DEngine {
16881689 await this . cleanupJob ( job )
16891690 return
16901691 }
1691- if ( ! ( await this . initializeVolumePermissions ( volume . Name ) ) ) {
1692- job . status = C2DStatusNumber . VolumeCreationFailed
1693- job . statusText = C2DStatusText . VolumeCreationFailed
1694- job . isRunning = false
1695- job . dateFinished = String ( Date . now ( ) / 1000 )
1696- await this . db . updateJob ( job )
1697- await this . cleanupJob ( job )
1698- return
1699- }
1692+ // if (!(await this.initializeVolumePermissions(volume.Name))) {
1693+ // job.status = C2DStatusNumber.VolumeCreationFailed
1694+ // job.statusText = C2DStatusText.VolumeCreationFailed
1695+ // job.isRunning = false
1696+ // job.dateFinished = String(Date.now() / 1000)
1697+ // await this.db.updateJob(job)
1698+ // await this.cleanupJob(job)
1699+ // return
1700+ // }
17001701
17011702 // create the container
17021703 const mountVols : any = { '/data' : { } }
@@ -2815,17 +2816,17 @@ export class C2DEngineDocker extends C2DEngine {
28152816 gzip : true ,
28162817 file : destination ,
28172818 sync : true ,
2818- C : folderToTar ,
2819- map : ( header : any ) => {
2820- header . uid = C2D_CONTAINER_UID
2821- header . gid = C2D_CONTAINER_GID
2822- // Docker's putArchive applies chmod but not chown — set directories
2823- // world-writable so the container user (uid 1000) can write to them
2824- if ( header . type === 'Directory' ) {
2825- header . mode = 0o777
2826- }
2827- return header
2828- }
2819+ C : folderToTar
2820+ // map: (header: any) => {
2821+ // header.uid = C2D_CONTAINER_UID
2822+ // header.gid = C2D_CONTAINER_GID
2823+ // // Docker's putArchive applies chmod but not chown — set directories
2824+ // // world-writable so the container user (uid 1000) can write to them
2825+ // if (header.type === 'Directory') {
2826+ // header.mode = 0o777
2827+ // }
2828+ // return header
2829+ // }
28292830 } as any ,
28302831 [ './' ]
28312832 )
@@ -2895,6 +2896,8 @@ export class C2DEngineDocker extends C2DEngine {
28952896 if ( ! existsSync ( dir ) ) {
28962897 mkdirSync ( dir , { recursive : true } )
28972898 }
2899+ // update directory permissions to allow read/write from job containers
2900+ chmodSync ( dir , 0o777 )
28982901 }
28992902 return true
29002903 } catch ( e ) {
0 commit comments