replace debug() with our custom logger
mostly we want trace() and log(). trace() can be enabled whenever we want by flipping a flag and restarting box
This commit is contained in:
@@ -3,7 +3,7 @@ import assert from 'node:assert';
|
||||
import BoxError from './boxerror.js';
|
||||
import constants from './constants.js';
|
||||
import dashboard from './dashboard.js';
|
||||
import debugModule from 'debug';
|
||||
import logger from './logger.js';
|
||||
import Docker from 'dockerode';
|
||||
import dockerRegistries from './dockerregistries.js';
|
||||
import fs from 'node:fs';
|
||||
@@ -17,7 +17,7 @@ import safe from 'safetydance';
|
||||
import timers from 'timers/promises';
|
||||
import volumes from './volumes.js';
|
||||
|
||||
const debug = debugModule('box:docker');
|
||||
const { log, trace } = logger('docker');
|
||||
const shell = shellModule('docker');
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ async function pullImage(imageRef) {
|
||||
|
||||
const authConfig = await getAuthConfig(imageRef);
|
||||
|
||||
debug(`pullImage: will pull ${imageRef}. auth: ${authConfig ? 'yes' : 'no'}`);
|
||||
log(`pullImage: will pull ${imageRef}. auth: ${authConfig ? 'yes' : 'no'}`);
|
||||
|
||||
const [error, stream] = await safe(gConnection.pull(imageRef, { authconfig: authConfig }));
|
||||
if (error && error.statusCode === 404) throw new BoxError(BoxError.NOT_FOUND, `Unable to pull image ${imageRef}. message: ${error.message} statusCode: ${error.statusCode}`);
|
||||
@@ -107,17 +107,17 @@ async function pullImage(imageRef) {
|
||||
let layerError = null;
|
||||
stream.on('data', function (chunk) {
|
||||
const data = safe.JSON.parse(chunk) || { };
|
||||
debug('pullImage: %j', data);
|
||||
log('pullImage: %j', data);
|
||||
|
||||
// The data.status here is useless because this is per layer as opposed to per image
|
||||
if (!data.status && data.error) { // data is { errorDetail: { message: xx } , error: xx }
|
||||
debug(`pullImage error ${imageRef}: ${data.errorDetail.message}`);
|
||||
log(`pullImage error ${imageRef}: ${data.errorDetail.message}`);
|
||||
layerError = data.errorDetail;
|
||||
}
|
||||
});
|
||||
|
||||
stream.on('end', function () {
|
||||
debug(`downloaded image ${imageRef} . error: ${!!layerError}`);
|
||||
log(`downloaded image ${imageRef} . error: ${!!layerError}`);
|
||||
|
||||
if (!layerError) return resolve();
|
||||
|
||||
@@ -125,7 +125,7 @@ async function pullImage(imageRef) {
|
||||
});
|
||||
|
||||
stream.on('error', function (streamError) { // this is only hit for stream error and not for some download error
|
||||
debug(`error pulling image ${imageRef}: %o`, streamError);
|
||||
log(`error pulling image ${imageRef}: %o`, streamError);
|
||||
reject(new BoxError(BoxError.DOCKER_ERROR, streamError.message));
|
||||
});
|
||||
});
|
||||
@@ -135,7 +135,7 @@ async function buildImage(dockerImage, sourceArchiveFilePath) {
|
||||
assert.strictEqual(typeof dockerImage, 'string');
|
||||
assert.strictEqual(typeof sourceArchiveFilePath, 'string');
|
||||
|
||||
debug(`buildImage: building ${dockerImage} from ${sourceArchiveFilePath}`);
|
||||
log(`buildImage: building ${dockerImage} from ${sourceArchiveFilePath}`);
|
||||
|
||||
const buildOptions = { t: dockerImage };
|
||||
const [listError, listOut] = await safe(shell.spawn('tar', ['-tzf', sourceArchiveFilePath], { encoding: 'utf8' }));
|
||||
@@ -146,7 +146,7 @@ async function buildImage(dockerImage, sourceArchiveFilePath) {
|
||||
});
|
||||
if (dockerfileCloudronPath) {
|
||||
buildOptions.dockerfile = dockerfileCloudronPath.replace(/\/$/, '');
|
||||
debug(`buildImage: using ${buildOptions.dockerfile}`);
|
||||
log(`buildImage: using ${buildOptions.dockerfile}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,23 +164,23 @@ async function buildImage(dockerImage, sourceArchiveFilePath) {
|
||||
buildError = data.errorDetail || { message: data.error };
|
||||
} else {
|
||||
const message = (data.stream || data.status || data.aux?.ID || '').replace(/\n$/, '');
|
||||
if (message) debug('buildImage: ' + message);
|
||||
if (message) log('buildImage: ' + message);
|
||||
}
|
||||
});
|
||||
|
||||
stream.on('end', () => {
|
||||
if (buildError) {
|
||||
debug(`buildImage: error ${buildError}`);
|
||||
log(`buildImage: error ${buildError}`);
|
||||
return reject(new BoxError(buildError.message.includes('no space') ? BoxError.FS_ERROR : BoxError.DOCKER_ERROR, buildError.message));
|
||||
} else {
|
||||
debug(`buildImage: success ${dockerImage}`);
|
||||
log(`buildImage: success ${dockerImage}`);
|
||||
}
|
||||
|
||||
resolve();
|
||||
});
|
||||
|
||||
stream.on('error', (streamError) => {
|
||||
debug(`buildImage: error building image ${dockerImage}: %o`, streamError);
|
||||
log(`buildImage: error building image ${dockerImage}: %o`, streamError);
|
||||
reject(new BoxError(BoxError.DOCKER_ERROR, streamError.message));
|
||||
});
|
||||
});
|
||||
@@ -329,7 +329,7 @@ async function restartContainer(containerId) {
|
||||
async function stopContainer(containerId) {
|
||||
assert.strictEqual(typeof containerId, 'string');
|
||||
|
||||
debug(`stopContainer: stopping container ${containerId}`);
|
||||
log(`stopContainer: stopping container ${containerId}`);
|
||||
|
||||
const container = gConnection.getContainer(containerId);
|
||||
|
||||
@@ -347,7 +347,7 @@ async function stopContainer(containerId) {
|
||||
async function deleteContainer(containerId) { // id can also be name
|
||||
assert.strictEqual(typeof containerId, 'string');
|
||||
|
||||
debug(`deleteContainer: deleting ${containerId}`);
|
||||
log(`deleteContainer: deleting ${containerId}`);
|
||||
|
||||
const container = gConnection.getContainer(containerId);
|
||||
|
||||
@@ -360,7 +360,7 @@ async function deleteContainer(containerId) { // id can also be name
|
||||
if (error && error.statusCode === 404) return;
|
||||
|
||||
if (error) {
|
||||
debug('Error removing container %s : %o', containerId, error);
|
||||
log('Error removing container %s : %o', containerId, error);
|
||||
throw new BoxError(BoxError.DOCKER_ERROR, error);
|
||||
}
|
||||
}
|
||||
@@ -405,14 +405,14 @@ async function deleteImage(imageRef) {
|
||||
// registry v1 used to pull down all *tags*. this meant that deleting image by tag was not enough (since that
|
||||
// just removes the tag). we used to remove the image by id. this is not required anymore because aliases are
|
||||
// not created anymore after https://github.com/docker/docker/pull/10571
|
||||
debug(`deleteImage: removing ${imageRef}`);
|
||||
log(`deleteImage: removing ${imageRef}`);
|
||||
const [error] = await safe(gConnection.getImage(imageRef.replace(/@sha256:.*/,'')).remove(removeOptions)); // can't have the manifest id. won't remove anythin
|
||||
if (error && error.statusCode === 400) return; // invalid image format. this can happen if user installed with a bad --docker-image
|
||||
if (error && error.statusCode === 404) return; // not found
|
||||
if (error && error.statusCode === 409) return; // another container using the image
|
||||
|
||||
if (error) {
|
||||
debug(`Error removing image ${imageRef} : %o`, error);
|
||||
log(`Error removing image ${imageRef} : %o`, error);
|
||||
throw new BoxError(BoxError.DOCKER_ERROR, error);
|
||||
}
|
||||
}
|
||||
@@ -432,7 +432,7 @@ async function inspect(containerId) {
|
||||
async function downloadImage(manifest) {
|
||||
assert.strictEqual(typeof manifest, 'object');
|
||||
|
||||
debug(`downloadImage: ${manifest.dockerImage}`);
|
||||
log(`downloadImage: ${manifest.dockerImage}`);
|
||||
|
||||
const image = gConnection.getImage(manifest.dockerImage);
|
||||
|
||||
@@ -441,7 +441,7 @@ async function downloadImage(manifest) {
|
||||
|
||||
const parsedManifestRef = parseImageRef(manifest.dockerImage);
|
||||
|
||||
await promiseRetry({ times: 10, interval: 5000, debug, retry: (pullError) => pullError.reason !== BoxError.FS_ERROR }, async () => {
|
||||
await promiseRetry({ times: 10, interval: 5000, debug: log, retry: (pullError) => pullError.reason !== BoxError.FS_ERROR }, async () => {
|
||||
// custom (non appstore) image
|
||||
if (parsedManifestRef.registry !== null || !parsedManifestRef.fullRepositoryName.startsWith('cloudron/')) return await pullImage(manifest.dockerImage);
|
||||
|
||||
@@ -457,9 +457,9 @@ async function downloadImage(manifest) {
|
||||
if (pullError || !upstreamRef) throw new BoxError(BoxError.DOCKER_ERROR, `Unable to pull ${manifest.dockerImage} from dockerhub or quay: ${pullError?.message}`);
|
||||
|
||||
// retag the downloaded image to not have the registry name. this prevents 'docker run' from redownloading it
|
||||
debug(`downloadImage: tagging ${upstreamRef} as ${parsedManifestRef.fullRepositoryName}:${parsedManifestRef.tag}`);
|
||||
log(`downloadImage: tagging ${upstreamRef} as ${parsedManifestRef.fullRepositoryName}:${parsedManifestRef.tag}`);
|
||||
await gConnection.getImage(upstreamRef).tag({ repo: parsedManifestRef.fullRepositoryName, tag: parsedManifestRef.tag });
|
||||
debug(`downloadImage: untagging ${upstreamRef}`);
|
||||
log(`downloadImage: untagging ${upstreamRef}`);
|
||||
await deleteImage(upstreamRef);
|
||||
});
|
||||
}
|
||||
@@ -731,7 +731,7 @@ async function createSubcontainer(app, name, cmd, options) {
|
||||
|
||||
containerOptions.HostConfig.Devices = Object.keys(app.devices).map((d) => {
|
||||
if (!safe.fs.existsSync(d)) {
|
||||
debug(`createSubcontainer: device ${d} does not exist. Skipping...`);
|
||||
log(`createSubcontainer: device ${d} does not exist. Skipping...`);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user