Skip to content

Commit f68ffbd

Browse files
authored
Add support for Docker credential providers which do not implement list command (#902)
1 parent 00539bd commit f68ffbd

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

packages/testcontainers/src/container-runtime/auth/credential-provider.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ describe("CredentialProvider", () => {
104104
);
105105
});
106106

107+
it("should not throw when list credentials command is not implemented", async () => {
108+
mockExec.mockImplementationOnce((command, callback) => {
109+
return callback(new Error(), null, "list is unimplemented\n");
110+
});
111+
112+
const credentials = await credentialProvider.getAuthConfig("registry", containerRuntimeConfig);
113+
114+
expect(credentials).toBeUndefined();
115+
});
116+
107117
it("should throw when get credentials fails", async () => {
108118
mockExecReturns(JSON.stringify({ registry: "username" }));
109119
mockSpawnReturns(

packages/testcontainers/src/container-runtime/auth/credential-provider.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ export abstract class CredentialProvider implements RegistryAuthLocator {
4242

4343
private listCredentials(providerName: string): Promise<CredentialProviderListResponse> {
4444
return new Promise((resolve, reject) => {
45-
exec(`${providerName} list`, (err, stdout) => {
45+
exec(`${providerName} list`, (err, stdout, stderr) => {
4646
if (err) {
47+
if (stderr === "list is unimplemented\n") {
48+
return resolve({});
49+
}
50+
4751
log.error(`An error occurred listing credentials: ${err}`);
4852
return reject(new Error("An error occurred listing credentials"));
4953
}

0 commit comments

Comments
 (0)