Skip to content

Commit

Permalink
Support image source on darwin
Browse files Browse the repository at this point in the history
Signed-off-by: Paweł Gronowski <[email protected]>
  • Loading branch information
vvoland committed Oct 16, 2024
1 parent 20a30f2 commit 239d270
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 15 deletions.
12 changes: 11 additions & 1 deletion src/docker/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,8 @@ disk: 60GiB
# This file: Mount the home as read-only, /tmp/lima as writable
mounts:
- location: "~"
- location: {{toolDir}}
mountPoint: /tool
- location: "/tmp/lima"
writable: true
Expand Down Expand Up @@ -221,7 +223,15 @@ provision:
EOF
fi
export DEBIAN_FRONTEND=noninteractive
curl -fsSL https://get.docker.com | sh -s -- --channel {{dockerBinChannel}} --version {{dockerBinVersion}}
if [ {{srcType}} == "archive" ]; then
curl -fsSL https://get.docker.com | sh -s -- --channel {{srcArchiveChannel}} --version {{srcArchiveVersion}}
if [ {{srcType}} == "image" ]; then
wget https://raw.githubusercontent.com/moby/moby/refs/heads/{{srcImageTag}}/contrib/init/systemd/docker.service -O /etc/systemd/system/docker.service
sed -i 's|^ExecStart=.*|ExecStart=/tool/dockerd|' /etc/systemd/system/docker.service
sed -i 's|containerd.service||' /etc/systemd/system/docker.service
systemctl daemon-reload
systemctl enable --now docker
fi
probes:
- script: |
Expand Down
24 changes: 14 additions & 10 deletions src/docker/install.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,16 @@ export class Install {
const cli = await HubRepository.build('dockereng/cli-bin');
extractFolder = await cli.extractImage(tag);

// Daemon is only available for Windows and Linux
if (['win32', 'linux'].includes(platform)) {
if (['win32', 'linux', 'darwin'].includes(platform)) {
core.info(`Downloading dockerd from moby/moby-bin:${tag}`);
const moby = await HubRepository.build('moby/moby-bin');
await moby.extractImage(tag, extractFolder);

// On macOS, we extract the Linux version of dockerd which will be run in a lima VM.
const extractPlatform = platform == 'darwin' ? 'linux' : undefined;

await moby.extractImage(tag, extractFolder, extractPlatform);
} else {
core.info(`dockerd not supported on ${platform}`);
core.warning(`dockerd not supported on ${platform}, only the Docker cli will be available`);
}
break;
}
Expand Down Expand Up @@ -192,10 +195,7 @@ export class Install {
}

private async installDarwin(): Promise<string> {
if (this.source.type !== 'archive') {
throw new Error('Only archive source is supported on macOS');
}
const src = this.source as InstallSourceArchive;
const src = this.source;
const limaDir = path.join(os.homedir(), '.lima', this.limaInstanceName);
await io.mkdirP(limaDir);
const dockerHost = `unix://${limaDir}/docker.sock`;
Expand Down Expand Up @@ -226,12 +226,16 @@ export class Install {
handlebars.registerHelper('stringify', function (obj) {
return new handlebars.SafeString(JSON.stringify(obj));
});
const srcArchive = src as InstallSourceArchive;
const limaCfg = handlebars.compile(limaYamlData)({
customImages: Install.limaCustomImages(),
daemonConfig: limaDaemonConfig,
dockerSock: `${limaDir}/docker.sock`,
dockerBinVersion: src.version.replace(/^v/, ''),
dockerBinChannel: src.channel
srcType: src.type,
srcArchiveVersion: srcArchive.version.replace(/^v/, ''),
srcArchiveChannel: srcArchive.channel,
srcImageTag: (src as InstallSourceImage).tag,
toolDir: this.toolDir
});
core.info(`Writing lima config to ${path.join(limaDir, 'lima.yaml')}`);
fs.writeFileSync(path.join(limaDir, 'lima.yaml'), limaCfg);
Expand Down
8 changes: 4 additions & 4 deletions src/hubRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ export class HubRepository {

// Unpacks the image layers and returns the path to the extracted image.
// Only OCI indexes/manifest list are supported for now.
public async extractImage(tag: string, destDir?: string): Promise<string> {
public async extractImage(tag: string, destDir?: string, osPlatform?: string): Promise<string> {
const index = await this.getManifest<Index>(tag);
if (index.mediaType != MEDIATYPE_IMAGE_INDEX_V1 && index.mediaType != MEDIATYPE_IMAGE_MANIFEST_LIST_V2) {
throw new Error(`Unsupported image media type: ${index.mediaType}`);
}
const digest = HubRepository.getPlatformManifestDigest(index);
const digest = HubRepository.getPlatformManifestDigest(index, osPlatform);
const manifest = await this.getManifest<Manifest>(digest);

const paths = manifest.layers.map(async layer => {
Expand Down Expand Up @@ -115,9 +115,9 @@ export class HubRepository {
return <T>JSON.parse(body);
}

private static getPlatformManifestDigest(index: Index): string {
private static getPlatformManifestDigest(index: Index, osPlatform?: string): string {
// This doesn't handle all possible platforms normalizations, but it's good enough for now.
let pos: string = os.platform();
let pos: string = osPlatform || os.platform();
if (pos == 'win32') {
pos = 'windows';
}
Expand Down

0 comments on commit 239d270

Please sign in to comment.