Skip to content

Commit 3acda9f

Browse files
committed
fix: try changing permissions at job start
1 parent 56ec166 commit 3acda9f

1 file changed

Lines changed: 75 additions & 72 deletions

File tree

src/components/c2d/compute_engine_docker.ts

Lines changed: 75 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import { getOceanTokenAddressForChain } from '../../utils/address.js'
5454
import { dockerRegistrysAuth, dockerRegistryAuth } from '../../@types/OceanNode.js'
5555
import { EncryptMethod } from '../../@types/fileObject.js'
5656
import { ZeroAddress } from 'ethers'
57+
import { chmodSync } from 'node:fs'
5758

5859
const C2D_CONTAINER_UID = 1000
5960
const 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

Comments
 (0)