- Don't claim that Windows uses XDG_RUNTIME_DIR, defer to the authoritative man page. - Consistently document the (regrettable?) REGISTRY_AUTH_FILE environment variable. - Consistently refer to "registry credentials file", not "authentication file". - (Also deemphasizes (docker login), I'm not sure we want that.) Signed-off-by: Miloslav Trmač <mitr@redhat.com>
9.7 KiB
% skopeo-experimental-image-proxy(1)
NAME
skopeo-experimental-image-proxy - API server for fetching container images (EXPERIMENTAL)
SYNOPSIS
skopeo experimental-image-proxy [options]
DESCRIPTION
EXPERIMENTAL COMMAND: This command is experimental, and its API is subject to change. It is currently hidden from the main help output and not supported on Windows.
skopeo experimental-image-proxy
exposes core container image fetching APIs via custom JSON+fd-passing protocol. This provides a lightweight way to fetch container image content (manifests and blobs). This command is primarily intended for programs that want to operate on a storage type that skopeo doesn't natively handle. For example, the bootc project currently has a custom ostree-based container storage backend.
The client process that invokes skopeo experimental-image-proxy
is responsible for creating a socket pair and passing one of the file descriptors to the proxy. By default, the proxy expects this file descriptor to be its standard input (fd 0), but a different fd can be specified using the --sockfd option.
Protocol Overview
The protocol requires a socketpair(2)
of type SOCK_SEQPACKET
, over which a single JSON message is sent per packet. Large data payloads, such as image manifests and blobs, are transferred over separate pipes (pipe(2)
), with the read-ends of these pipes passed to the client via file descriptor (FD) passing.
- Request Format: A JSON object:
{ "method": "MethodName", "args": [arguments] }
- Reply Format: A JSON object:
{ "success": boolean, "value": JSONValue, "pipeid": number, "error_code": string, "error": string }
success
:true
if the call succeeded,false
otherwise.value
: The return value of the method, if any.pipeid
: An integer identifying a pipe for data transfer. This ID is used with theFinishPipe
method.error_code
: A string indicating the type of error ifsuccess
isfalse
(e.g., "EPIPE", "retryable", "other"). (Introduced in protocol version 0.2.8)error
: A string describing the error ifsuccess
isfalse
.
The current protocol version is 0.2.8
.
Supported Protocol Methods
The server supports the following methods:
- Initialize: Initializes the proxy. This method must be called before any other method.
- Args:
[]
(empty array) - Returns:
string
(the protocol version, e.g., "0.2.8")
- Args:
- OpenImage: Opens an image reference (e.g.,
docker://quay.io/example/image:latest
).- Args:
[string imageName]
- Returns:
uint64
(an opaque image ID to be used in subsequent calls)
- Args:
- OpenImageOptional: Similar to
OpenImage
, but if the image is not found, it returns0
(a sentinel image ID) instead of an error.- Args:
[string imageName]
- Returns:
uint64
(opaque image ID, or0
if the image is not found)
- Args:
- CloseImage: Closes a previously opened image, releasing associated resources.
- Args:
[uint64 imageID]
- Returns:
null
- Args:
- GetManifest: Retrieves the image manifest. If the image is a manifest list, it is resolved to an image matching the proxy's current OS and architecture. The manifest is converted to OCI format if it isn't already. The
value
field in the reply contains the original digest of the manifest (if the image is a manifest list, this is the digest of the list, not the per-platform instance). The manifest content is streamed over a pipe.- Args:
[uint64 imageID]
- Returns:
string
(manifest digest invalue
), manifest data via pipe.
- Args:
- GetFullConfig: Retrieves the full image configuration, conforming to the OCI Image Format Specification. Configuration data is streamed over a pipe.
- Args:
[uint64 imageID]
- Returns:
null
, configuration data via pipe.
- Args:
- GetBlob: Fetches an image blob (e.g., a layer) by its digest and expected size. The proxy performs digest verification on the blob data. The
value
field in the reply contains the blob size. Blob data is streamed over a pipe.- Args:
[uint64 imageID, string digest, uint64 size]
- Returns:
int64
(blob size invalue
,-1
if unknown), blob data via pipe.
- Args:
- GetRawBlob: Fetches an image blob by its digest. Unlike
GetBlob
, this method does not perform server-side digest verification. It returns two file descriptors to the client: one for the blob data and another for reporting errors that occur during the streaming. This method does not use theFinishPipe
mechanism. Thevalue
field in the reply contains the blob size. (Introduced in protocol version 0.2.8)- Args:
[uint64 imageID, string digest]
- Returns:
int64
(blob size invalue
,-1
if unknown), and two file descriptors: one for the blob data, one for errors. The error is aProxyError
type, see below.
- Args:
- GetLayerInfoPiped: Retrieves information about image layers. This replaces
GetLayerInfo
. Layer information data is streamed over a pipe, which makes it more reliable for images with many layers that would exceed message size limits withGetLayerInfo
. The returned data is a JSON array of{digest: string, size: int64, media_type: string}
. (Introduced in protocol version 0.2.7)- Args:
[uint64 imageID]
- Returns:
null
, layer information data via pipe.
- Args:
- FinishPipe: Signals that the client has finished reading all data from a pipe associated with a
pipeid
(obtained from methods likeGetManifest
orGetBlob
). This allows the server to close its end of the pipe and report any pending errors (e.g., digest verification failure forGetBlob
). This method must be called by the client after consuming data from a pipe, except for pipes fromGetRawBlob
.- Args:
[uint32 pipeID]
- Returns:
null
- Args:
- Shutdown: Instructs the proxy server to terminate gracefully.
- Args:
[]
(empty array) - Returns:
null
- Args:
The following methods are deprecated:
- GetConfig: (deprecated) Retrieves the container runtime configuration part of the image (the OCI
config
field). Note: This method returns only a part of the full image configuration due to a historical oversight. UseGetFullConfig
for the complete image configuration. Configuration data is streamed over a pipe.- Args:
[uint64 imageID]
- Returns:
null
, configuration data via pipe.
- Args:
- GetLayerInfo: (deprecated) Retrieves an array of objects, each describing an image layer (digest, size, mediaType). Note: This method returns data inline and may fail for images with many layers due to message size limits. Use
GetLayerInfoPiped
for a more robust solution.- Args:
[uint64 imageID]
- Returns:
array
of{digest: string, size: int64, media_type: string}
.
- Args:
Data Transfer for Pipes
When a method returns a pipeid
, the server also passes the read-end of a pipe via file descriptor (FD) passing. The client reads the data (e.g., manifest content, blob content) from this FD. After successfully reading all data, the client must call FinishPipe
with the corresponding pipeid
. This signals to the server that the transfer is complete, allows the server to clean up resources, and enables the client to check for any errors that might have occurred during the data streaming process (e.g., a digest mismatch during GetBlob
). The GetRawBlob
method is an exception; it uses a dedicated error pipe instead of the FinishPipe
mechanism.
ProxyError
GetBlobRaw
returns a JSON object of the following form in the error pipe where:
{
"code": "EPIPE" | "retryable" | "other",
"message": "error message"
}
- EPIPE: The client closed the pipe before reading all data.
- retryable: The operation failed but might succeed if retried.
- other: A generic error occurred.
OPTIONS
--sockfd=fd Serve on the opened socket passed as file descriptor fd. Defaults to 0 (standard input).
The command also supports common skopeo options for interacting with image registries and local storage. These include:
--authfile=path
Path of the primary registry credentials file. On Linux, the default is ${XDG_RUNTIME_DIR}/containers/auth.json. See containers-auth.json(5) for more details about the credential search mechanism and defaults on other platforms.
Use skopeo login
to manage the credentials.
The default value of this option is read from the REGISTRY\_AUTH\_FILE
environment variable.
--cert-dir=path
Use certificates at path (*.crt, *.cert, *.key) to connect to the registry.
--creds username[:password]
Username and password for accessing the registry.
--daemon-host host
Use docker daemon host at host (docker-daemon:
transport only)
--no-creds
Access the registry anonymously.
--password=password
Password for accessing the registry. Use with --username.
--registry-token=token
Provide a Bearer token for accessing the registry.
--shared-blob-dir directory
Directory to use to share blobs across OCI repositories.
--tls-verify=bool
Require HTTPS and verify certificates when talking to the container registry or daemon. Default to registry.conf setting.
--username=username Username for accessing the registry. Use with --password.
REFERENCE CLIENT LIBRARIES
- Rust: The containers-image-proxy-rs project serves as the reference Rust client.
PROTOCOL HISTORY
- 0.2.1: Initial version
- 0.2.2: Added support for fetching image configuration as OCI
- 0.2.3: Added GetFullConfig
- 0.2.4: Added OpenImageOptional
- 0.2.5: Added LayerInfoJSON
- 0.2.6: Policy Verification before pulling OCI
- 0.2.7: Added GetLayerInfoPiped
- 0.2.8: Added GetRawBlob and error_code to replies
SEE ALSO
skopeo(1), containers-auth.json(5)