Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/assets/container/python/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim

ARG UV_DEFAULT_INDEX
ARG UV_INDEX

WORKDIR /app

ENV UV_SYSTEM_PYTHON=1 \
UV_COMPILE_BYTECODE=1 \
UV_NO_PROGRESS=1 \
PYTHONUNBUFFERED=1 \
DOCKER_CONTAINER=1
DOCKER_CONTAINER=1 \
UV_DEFAULT_INDEX=${UV_DEFAULT_INDEX} \
UV_INDEX=${UV_INDEX}

RUN useradd -m -u 1000 bedrock_agentcore

Expand Down
15 changes: 10 additions & 5 deletions src/cli/operations/dev/container-dev-server.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { CONTAINER_INTERNAL_PORT, DOCKERFILE_NAME } from '../../../lib';
import { getUvBuildArgs } from '../../../lib/packaging/build-args';
import { detectContainerRuntime, getStartHint } from '../../external-requirements/detect';
import { DevServer, type LogLevel, type SpawnConfig } from './dev-server';
import { convertEntrypointToModule } from './utils';
Expand Down Expand Up @@ -62,7 +63,7 @@ export class ContainerDevServer extends DevServer {
onLog('system', `Building container image: ${this.imageName}...`);
const buildResult = spawnSync(
this.runtimeBinary,
['build', '-t', baseImageName, '-f', dockerfilePath, this.config.directory],
['build', '-t', baseImageName, '-f', dockerfilePath, ...getUvBuildArgs(), this.config.directory],
{ stdio: 'pipe' }
);

Expand All @@ -86,10 +87,14 @@ export class ContainerDevServer extends DevServer {
' || (pip install -q uvicorn && pip install -q /app)',
].join('\n');

const devBuild = spawnSync(this.runtimeBinary, ['build', '-t', this.imageName, '-f', '-', this.config.directory], {
input: devDockerfile,
stdio: ['pipe', 'pipe', 'pipe'],
});
const devBuild = spawnSync(
this.runtimeBinary,
['build', '-t', this.imageName, '-f', '-', ...getUvBuildArgs(), this.config.directory],
{
input: devDockerfile,
stdio: ['pipe', 'pipe', 'pipe'],
}
);

this.logBuildOutput(devBuild.stdout, devBuild.stderr, onLog);

Expand Down
13 changes: 13 additions & 0 deletions src/lib/packaging/build-args.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { readCliConfig } from '../schemas/io/cli-config';

/**
* Return Docker --build-arg flags for UV index URLs configured in ~/.agentcore/config.json.
* Returns an empty array when no custom indexes are configured.
*/
export function getUvBuildArgs(): string[] {
const config = readCliConfig();
const args: string[] = [];
if (config.uvDefaultIndex) args.push('--build-arg', `UV_DEFAULT_INDEX=${config.uvDefaultIndex}`);
if (config.uvIndex) args.push('--build-arg', `UV_INDEX=${config.uvIndex}`);
return args;
}
11 changes: 8 additions & 3 deletions src/lib/packaging/container.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { AgentEnvSpec } from '../../schema';
import { CONTAINER_RUNTIMES, DOCKERFILE_NAME, ONE_GB } from '../constants';
import { getUvBuildArgs } from './build-args';
import { PackagingError } from './errors';
import { resolveCodeLocation } from './helpers';
import type { ArtifactResult, PackageOptions, RuntimePackager } from './types/packaging';
Expand Down Expand Up @@ -57,9 +58,13 @@ export class ContainerPackager implements RuntimePackager {

// Build locally
const imageName = `agentcore-package-${agentName}`;
const buildResult = spawnSync(runtime, ['build', '-t', imageName, '-f', dockerfilePath, codeLocation], {
stdio: 'pipe',
});
const buildResult = spawnSync(
runtime,
['build', '-t', imageName, '-f', dockerfilePath, ...getUvBuildArgs(), codeLocation],
{
stdio: 'pipe',
}
);

if (buildResult.status !== 0) {
return Promise.reject(new PackagingError(`Container build failed:\n${buildResult.stderr?.toString()}`));
Expand Down
27 changes: 27 additions & 0 deletions src/lib/schemas/io/cli-config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { readFileSync } from 'fs';
import { homedir } from 'os';
import { join } from 'path';

const CONFIG_FILE = join(homedir(), '.agentcore', 'config.json');

export interface CliConfig {
uvDefaultIndex?: string;
uvIndex?: string;
}

/**
* Read the global CLI config from ~/.agentcore/config.json.
* Returns an empty object if the file doesn't exist or is malformed.
*/
export function readCliConfig(): CliConfig {
try {
const data = readFileSync(CONFIG_FILE, 'utf-8');
const parsed: Record<string, unknown> = JSON.parse(data) as Record<string, unknown>;
const config: CliConfig = {};
if (typeof parsed.uvDefaultIndex === 'string') config.uvDefaultIndex = parsed.uvDefaultIndex;
if (typeof parsed.uvIndex === 'string') config.uvIndex = parsed.uvIndex;
return config;
} catch {
return {};
}
}
1 change: 1 addition & 0 deletions src/lib/schemas/io/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ export {
type PathConfig,
} from './path-resolver';
export { ConfigIO, createConfigIO } from './config-io';
export { readCliConfig, type CliConfig } from './cli-config';
Loading