Compare commits
No commits in common. "master" and "v1.2.1" have entirely different histories.
164
changelog.md
164
changelog.md
@ -1,164 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## 2024-12-23 - 1.3.0 - feat(core)
|
|
||||||
Initial release of Docker client with TypeScript support
|
|
||||||
|
|
||||||
- Provides easy communication with Docker's remote API from Node.js
|
|
||||||
- Includes implementations for managing Docker services, networks, secrets, containers, and images
|
|
||||||
|
|
||||||
## 2024-12-23 - 1.2.8 - fix(core)
|
|
||||||
Improved the image creation process from tar stream in DockerImage class.
|
|
||||||
|
|
||||||
- Enhanced `DockerImage.createFromTarStream` method to handle streamed response and parse imported image details.
|
|
||||||
- Fixed the dependency version for `@push.rocks/smartarchive` in package.json.
|
|
||||||
|
|
||||||
## 2024-10-13 - 1.2.7 - fix(core)
|
|
||||||
Prepare patch release with minor fixes and improvements
|
|
||||||
|
|
||||||
|
|
||||||
## 2024-10-13 - 1.2.6 - fix(core)
|
|
||||||
Minor refactoring and code quality improvements.
|
|
||||||
|
|
||||||
|
|
||||||
## 2024-10-13 - 1.2.5 - fix(dependencies)
|
|
||||||
Update dependencies for stability improvements
|
|
||||||
|
|
||||||
- Updated @push.rocks/smartstream to version ^3.0.46
|
|
||||||
- Updated @push.rocks/tapbundle to version ^5.3.0
|
|
||||||
- Updated @types/node to version 22.7.5
|
|
||||||
|
|
||||||
## 2024-10-13 - 1.2.4 - fix(core)
|
|
||||||
Refactored DockerImageStore constructor to remove DockerHost dependency
|
|
||||||
|
|
||||||
- Adjusted DockerImageStore constructor to remove dependency on DockerHost
|
|
||||||
- Updated ts/classes.host.ts to align with DockerImageStore's new constructor signature
|
|
||||||
|
|
||||||
## 2024-08-21 - 1.2.3 - fix(dependencies)
|
|
||||||
Update dependencies to the latest versions and fix image export test
|
|
||||||
|
|
||||||
- Updated several dependencies to their latest versions in package.json.
|
|
||||||
- Enabled the previously skipped 'should export images' test.
|
|
||||||
|
|
||||||
## 2024-06-10 - 1.2.1-1.2.2 - Core/General
|
|
||||||
General updates and fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2024-06-10 - 1.2.0 - Core
|
|
||||||
Core updates and bug fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2024-06-08 - 1.2.0 - General/Core
|
|
||||||
Major release with core enhancements.
|
|
||||||
|
|
||||||
- Processing images with extraction, retagging, repackaging, and long-term storage
|
|
||||||
|
|
||||||
## 2024-06-06 - 1.1.4 - General/Imagestore
|
|
||||||
Significant feature addition.
|
|
||||||
|
|
||||||
- Add feature to process images with extraction, retagging, repackaging, and long-term storage
|
|
||||||
|
|
||||||
## 2024-05-08 - 1.0.112 - Images
|
|
||||||
Add new functionality for image handling.
|
|
||||||
|
|
||||||
- Can now import and export images
|
|
||||||
- Start work on local 100% JS OCI image registry
|
|
||||||
|
|
||||||
## 2024-06-05 - 1.1.0-1.1.3 - Core
|
|
||||||
Regular updates and fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2024-02-02 - 1.0.105-1.0.110 - Core
|
|
||||||
Routine core updates and fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2022-10-17 - 1.0.103-1.0.104 - Core
|
|
||||||
Routine core updates.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2020-10-01 - 1.0.99-1.0.102 - Core
|
|
||||||
Routine core updates.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2019-09-22 - 1.0.73-1.0.78 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2019-09-13 - 1.0.60-1.0.72 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2019-08-16 - 1.0.43-1.0.59 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2019-08-15 - 1.0.37-1.0.42 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2019-08-14 - 1.0.31-1.0.36 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2019-01-10 - 1.0.27-1.0.30 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core update
|
|
||||||
|
|
||||||
## 2018-07-16 - 1.0.23-1.0.24 - Core
|
|
||||||
Routine updates and core fixes.
|
|
||||||
|
|
||||||
- Fix core shift to new style
|
|
||||||
|
|
||||||
## 2017-07-16 - 1.0.20-1.0.22 - General
|
|
||||||
Routine updates and fixes.
|
|
||||||
|
|
||||||
- Update node_modules within npmdocker
|
|
||||||
|
|
||||||
## 2017-04-02 - 1.0.18-1.0.19 - General
|
|
||||||
Routine updates and fixes.
|
|
||||||
|
|
||||||
- Work with npmdocker and npmts 7.x.x
|
|
||||||
- CI updates
|
|
||||||
|
|
||||||
## 2016-07-31 - 1.0.17 - General
|
|
||||||
Enhancements and fixes.
|
|
||||||
|
|
||||||
- Now waiting for response to be stored before ending streaming request
|
|
||||||
- Cosmetic fix
|
|
||||||
|
|
||||||
## 2016-07-29 - 1.0.14-1.0.16 - General
|
|
||||||
Multiple updates and features added.
|
|
||||||
|
|
||||||
- Fix request for change observable and add npmdocker
|
|
||||||
- Add request typings
|
|
||||||
|
|
||||||
## 2016-07-28 - 1.0.13 - Core
|
|
||||||
Fixes and preparations.
|
|
||||||
|
|
||||||
- Fixed request for newer docker
|
|
||||||
- Prepare for npmdocker
|
|
||||||
|
|
||||||
|
|
||||||
## 2016-06-16 - 1.0.0-1.0.2 - General
|
|
||||||
Initial sequence of releases, significant feature additions and CI setups.
|
|
||||||
|
|
||||||
- Implement container start and stop
|
|
||||||
- Implement list containers and related functions
|
|
||||||
- Add tests with in docker environment
|
|
||||||
|
|
||||||
## 2016-04-12 - unknown - Initial Commit
|
|
||||||
Initial project setup.
|
|
||||||
|
|
||||||
- Initial commit
|
|
||||||
|
|
22
package.json
22
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@apiclient.xyz/docker",
|
"name": "@apiclient.xyz/docker",
|
||||||
"version": "1.3.0",
|
"version": "1.2.1",
|
||||||
"description": "Provides easy communication with Docker remote API from Node.js, with TypeScript support.",
|
"description": "Provides easy communication with Docker remote API from Node.js, with TypeScript support.",
|
||||||
"private": false,
|
"private": false,
|
||||||
"main": "dist_ts/index.js",
|
"main": "dist_ts/index.js",
|
||||||
@ -34,29 +34,29 @@
|
|||||||
"homepage": "https://gitlab.com/mojoio/docker#readme",
|
"homepage": "https://gitlab.com/mojoio/docker#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@push.rocks/lik": "^6.0.15",
|
"@push.rocks/lik": "^6.0.15",
|
||||||
"@push.rocks/smartarchive": "^4.0.39",
|
"@push.rocks/smartarchive": "^4.0.37",
|
||||||
"@push.rocks/smartbucket": "^3.0.22",
|
"@push.rocks/smartbucket": "^3.0.13",
|
||||||
"@push.rocks/smartfile": "^11.0.21",
|
"@push.rocks/smartfile": "^11.0.20",
|
||||||
"@push.rocks/smartjson": "^5.0.20",
|
"@push.rocks/smartjson": "^5.0.20",
|
||||||
"@push.rocks/smartlog": "^3.0.7",
|
"@push.rocks/smartlog": "^3.0.7",
|
||||||
"@push.rocks/smartnetwork": "^3.0.0",
|
"@push.rocks/smartnetwork": "^3.0.0",
|
||||||
"@push.rocks/smartpath": "^5.0.18",
|
"@push.rocks/smartpath": "^5.0.18",
|
||||||
"@push.rocks/smartpromise": "^4.0.4",
|
"@push.rocks/smartpromise": "^4.0.3",
|
||||||
"@push.rocks/smartrequest": "^2.0.22",
|
"@push.rocks/smartrequest": "^2.0.22",
|
||||||
"@push.rocks/smartstream": "^3.0.46",
|
"@push.rocks/smartstream": "^3.0.44",
|
||||||
"@push.rocks/smartstring": "^4.0.15",
|
"@push.rocks/smartstring": "^4.0.15",
|
||||||
"@push.rocks/smartunique": "^3.0.9",
|
"@push.rocks/smartunique": "^3.0.9",
|
||||||
"@push.rocks/smartversion": "^3.0.5",
|
"@push.rocks/smartversion": "^3.0.5",
|
||||||
"@tsclass/tsclass": "^4.1.2",
|
"@tsclass/tsclass": "^4.0.55",
|
||||||
"rxjs": "^7.5.7"
|
"rxjs": "^7.5.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@git.zone/tsbuild": "^2.1.84",
|
"@git.zone/tsbuild": "^2.1.80",
|
||||||
"@git.zone/tsrun": "^1.2.49",
|
"@git.zone/tsrun": "^1.2.12",
|
||||||
"@git.zone/tstest": "^1.0.90",
|
"@git.zone/tstest": "^1.0.90",
|
||||||
"@push.rocks/qenv": "^6.0.5",
|
"@push.rocks/qenv": "^6.0.5",
|
||||||
"@push.rocks/tapbundle": "^5.3.0",
|
"@push.rocks/tapbundle": "^5.0.23",
|
||||||
"@types/node": "22.7.5"
|
"@types/node": "20.14.2"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"ts/**/*",
|
"ts/**/*",
|
||||||
|
2482
pnpm-lock.yaml
generated
2482
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@ -122,7 +122,7 @@ tap.test('should create a service', async () => {
|
|||||||
await testSecret.remove();
|
await testSecret.remove();
|
||||||
});
|
});
|
||||||
|
|
||||||
tap.test('should export images', async (toolsArg) => {
|
tap.skip.test('should export images', async (toolsArg) => {
|
||||||
const done = toolsArg.defer();
|
const done = toolsArg.defer();
|
||||||
const testImage = await docker.DockerImage.createFromRegistry(testDockerHost, {
|
const testImage = await docker.DockerImage.createFromRegistry(testDockerHost, {
|
||||||
creationObject: {
|
creationObject: {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/**
|
/**
|
||||||
* autocreated commitinfo by @push.rocks/commitinfo
|
* autocreated commitinfo by @pushrocks/commitinfo
|
||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@apiclient.xyz/docker',
|
name: '@apiclient.xyz/docker',
|
||||||
version: '1.3.0',
|
version: '1.2.1',
|
||||||
description: 'Provides easy communication with Docker remote API from Node.js, with TypeScript support.'
|
description: 'Provides easy communication with Docker remote API from Node.js, with TypeScript support.'
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ export class DockerHost {
|
|||||||
}
|
}
|
||||||
console.log(`using docker sock at ${pathToUse}`);
|
console.log(`using docker sock at ${pathToUse}`);
|
||||||
this.socketPath = pathToUse;
|
this.socketPath = pathToUse;
|
||||||
this.imageStore = new DockerImageStore({
|
this.imageStore = new DockerImageStore(this, {
|
||||||
bucketDir: null,
|
bucketDir: null,
|
||||||
localDirPath: this.options.imageStoreDir,
|
localDirPath: this.options.imageStoreDir,
|
||||||
})
|
})
|
||||||
|
@ -82,93 +82,13 @@ export class DockerImage {
|
|||||||
* @param dockerHostArg
|
* @param dockerHostArg
|
||||||
* @param tarStreamArg
|
* @param tarStreamArg
|
||||||
*/
|
*/
|
||||||
public static async createFromTarStream(
|
public static async createFromTarStream(dockerHostArg: DockerHost, optionsArg: {
|
||||||
dockerHostArg: DockerHost,
|
creationObject: interfaces.IImageCreationDescriptor,
|
||||||
optionsArg: {
|
tarStream: plugins.smartstream.stream.Readable,
|
||||||
creationObject: interfaces.IImageCreationDescriptor;
|
}) {
|
||||||
tarStream: plugins.smartstream.stream.Readable;
|
const response = await dockerHostArg.requestStreaming('POST', '/images/load', optionsArg.tarStream);
|
||||||
|
return response;
|
||||||
}
|
}
|
||||||
): Promise<DockerImage> {
|
|
||||||
// Start the request for importing an image
|
|
||||||
const response = await dockerHostArg.requestStreaming(
|
|
||||||
'POST',
|
|
||||||
'/images/load',
|
|
||||||
optionsArg.tarStream
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Docker typically returns lines like:
|
|
||||||
* {"stream":"Loaded image: myrepo/myimage:latest"}
|
|
||||||
*
|
|
||||||
* So we will collect those lines and parse out the final image name.
|
|
||||||
*/
|
|
||||||
let rawOutput = '';
|
|
||||||
response.on('data', (chunk) => {
|
|
||||||
rawOutput += chunk.toString();
|
|
||||||
});
|
|
||||||
|
|
||||||
// Wrap the end event in a Promise for easier async/await usage
|
|
||||||
await new Promise<void>((resolve, reject) => {
|
|
||||||
response.on('end', () => {
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
response.on('error', (err) => {
|
|
||||||
reject(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Attempt to parse each line to find something like "Loaded image: ..."
|
|
||||||
let loadedImageTag: string | undefined;
|
|
||||||
const lines = rawOutput.trim().split('\n').filter(Boolean);
|
|
||||||
|
|
||||||
for (const line of lines) {
|
|
||||||
try {
|
|
||||||
const jsonLine = JSON.parse(line);
|
|
||||||
if (
|
|
||||||
jsonLine.stream &&
|
|
||||||
(jsonLine.stream.startsWith('Loaded image:') ||
|
|
||||||
jsonLine.stream.startsWith('Loaded image ID:'))
|
|
||||||
) {
|
|
||||||
// Examples:
|
|
||||||
// "Loaded image: your-image:latest"
|
|
||||||
// "Loaded image ID: sha256:...."
|
|
||||||
loadedImageTag = jsonLine.stream
|
|
||||||
.replace('Loaded image: ', '')
|
|
||||||
.replace('Loaded image ID: ', '')
|
|
||||||
.trim();
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
// not valid JSON, ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!loadedImageTag) {
|
|
||||||
throw new Error(
|
|
||||||
`Could not parse the loaded image info from Docker response.\nResponse was:\n${rawOutput}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now try to look up that image by the "loadedImageTag".
|
|
||||||
// Depending on Docker’s response, it might be something like:
|
|
||||||
// "myrepo/myimage:latest" OR "sha256:someHash..."
|
|
||||||
// If Docker gave you an ID (e.g. "sha256:..."), you may need a separate
|
|
||||||
// DockerImage.getImageById method; or if you prefer, you can treat it as a name.
|
|
||||||
const newlyImportedImage = await DockerImage.getImageByName(dockerHostArg, loadedImageTag);
|
|
||||||
|
|
||||||
if (!newlyImportedImage) {
|
|
||||||
throw new Error(
|
|
||||||
`Image load succeeded, but no local reference found for "${loadedImageTag}".`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.log(
|
|
||||||
'info',
|
|
||||||
`Successfully imported image "${loadedImageTag}".`
|
|
||||||
);
|
|
||||||
|
|
||||||
return newlyImportedImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static async tagImageByIdOrName(
|
public static async tagImageByIdOrName(
|
||||||
dockerHost: DockerHost,
|
dockerHost: DockerHost,
|
||||||
@ -179,8 +99,6 @@ export class DockerImage {
|
|||||||
'POST',
|
'POST',
|
||||||
`/images/${encodeURIComponent(idOrNameArg)}/${encodeURIComponent(newTagArg)}`
|
`/images/${encodeURIComponent(idOrNameArg)}/${encodeURIComponent(newTagArg)}`
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async buildImage(dockerHostArg: DockerHost, dockerImageTag) {
|
public static async buildImage(dockerHostArg: DockerHost, dockerImageTag) {
|
||||||
|
@ -17,7 +17,7 @@ export interface IDockerImageStoreConstructorOptions {
|
|||||||
export class DockerImageStore {
|
export class DockerImageStore {
|
||||||
public options: IDockerImageStoreConstructorOptions;
|
public options: IDockerImageStoreConstructorOptions;
|
||||||
|
|
||||||
constructor(optionsArg: IDockerImageStoreConstructorOptions) {
|
constructor(dockerHost: DockerHost, optionsArg: IDockerImageStoreConstructorOptions) {
|
||||||
this.options = optionsArg;
|
this.options = optionsArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user