Skip to content

Commit 3d68780

Browse files
authored
Merge pull request #341 from crazy-max/docker-context-tls
create docker context if default one has TLS data loaded
2 parents aa33708 + d069e98 commit 3d68780

File tree

5 files changed

+50
-5
lines changed

5 files changed

+50
-5
lines changed

action.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ inputs:
5252
description: 'Cleanup temp files and remove builder at the end of a job'
5353
default: 'true'
5454
required: false
55-
# deprecated inputs
55+
# TODO: remove deprecated config and config-inline inputs
5656
config:
5757
description: 'BuildKit daemon config file'
5858
deprecationMessage: 'Use buildkitd-config instead'

dist/index.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.ts

+40
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as fs from 'fs';
22
import * as yaml from 'js-yaml';
3+
import * as uuid from 'uuid';
34
import * as core from '@actions/core';
45
import * as actionsToolkit from '@docker/actions-toolkit';
56

@@ -68,6 +69,33 @@ actionsToolkit.run(
6869
fs.mkdirSync(Buildx.certsDir, {recursive: true});
6970
stateHelper.setCertsDir(Buildx.certsDir);
7071

72+
// if the default context has TLS data loaded and endpoint is not set, then
73+
// we create a temporary docker context only if driver is docker-container
74+
// https://github.com/docker/buildx/blob/b96ad59f64d40873e4959336d294b648bb3937fe/builder/builder.go#L489
75+
// https://github.com/docker/setup-buildx-action/issues/105
76+
if (!standalone && inputs.driver == 'docker-container' && (await Docker.context()) == 'default' && inputs.endpoint.length == 0) {
77+
const contextInfo = await Docker.contextInspect('default');
78+
core.debug(`context info: ${JSON.stringify(contextInfo, undefined, 2)}`);
79+
const hasTLSData = Object.keys(contextInfo.Endpoints).length > 0 && Object.values(contextInfo.Endpoints)[0].TLSData;
80+
const hasTLSMaterial = Object.keys(contextInfo.TLSMaterial).length > 0 && Object.values(contextInfo.TLSMaterial)[0].length > 0;
81+
if (hasTLSData || hasTLSMaterial) {
82+
const tmpDockerContext = `buildx-${uuid.v4()}`;
83+
await core.group(`Creating temp docker context (TLS data loaded in default one)`, async () => {
84+
await Docker.getExecOutput(['context', 'create', tmpDockerContext], {
85+
ignoreReturnCode: true
86+
}).then(res => {
87+
if (res.stderr.length > 0 && res.exitCode != 0) {
88+
core.warning(`cannot create docker context ${tmpDockerContext}: ${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`);
89+
} else {
90+
core.info(`Setting builder endpoint to ${tmpDockerContext} context`);
91+
inputs.endpoint = tmpDockerContext;
92+
stateHelper.setTmpDockerContext(tmpDockerContext);
93+
}
94+
});
95+
});
96+
}
97+
}
98+
7199
if (inputs.driver !== 'docker') {
72100
await core.group(`Creating a new builder instance`, async () => {
73101
const certsDriverOpts = Buildx.resolveCertsDriverOpts(inputs.driver, inputs.endpoint, {
@@ -214,6 +242,18 @@ actionsToolkit.run(
214242
});
215243
}
216244

245+
if (stateHelper.tmpDockerContext) {
246+
await core.group(`Removing temp docker context`, async () => {
247+
await Exec.getExecOutput('docker', ['context', 'rm', '-f', stateHelper.tmpDockerContext], {
248+
ignoreReturnCode: true
249+
}).then(res => {
250+
if (res.stderr.length > 0 && res.exitCode != 0) {
251+
core.warning(`${res.stderr.match(/(.*)\s*$/)?.[0]?.trim() ?? 'unknown error'}`);
252+
}
253+
});
254+
});
255+
}
256+
217257
if (stateHelper.certsDir.length > 0 && fs.existsSync(stateHelper.certsDir)) {
218258
await core.group(`Cleaning up certificates`, async () => {
219259
fs.rmSync(stateHelper.certsDir, {recursive: true});

src/state-helper.ts

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const builderName = process.env['STATE_builderName'] || '';
66
export const builderDriver = process.env['STATE_builderDriver'] || '';
77
export const containerName = process.env['STATE_containerName'] || '';
88
export const certsDir = process.env['STATE_certsDir'] || '';
9+
export const tmpDockerContext = process.env['STATE_tmpDockerContext'] || '';
910
export const cleanup = /true/i.test(process.env['STATE_cleanup'] || '');
1011

1112
export function setDebug(debug: string) {
@@ -32,6 +33,10 @@ export function setCertsDir(certsDir: string) {
3233
core.saveState('certsDir', certsDir);
3334
}
3435

36+
export function setTmpDockerContext(tmpDockerContext: string) {
37+
core.saveState('tmpDockerContext', tmpDockerContext);
38+
}
39+
3540
export function setCleanup(cleanup: boolean) {
3641
core.saveState('cleanup', cleanup);
3742
}

0 commit comments

Comments
 (0)