CDKではCDK_DOCKER環境変数を指定することで任意のコマンドでDockerビルドができる
2022-12-22 12:20 この記事のきっかけとなった記事を書き換えたため、この記事も少し変更してお送りします。
こんにちは。サービス部の武田です。
CDKのLambda Pythonのビルドでは、Rancher Desktopなどdocker
コマンドが使用できる環境を整えれば実行可能です。
最初Rancher Desktopをインストールしてうまくいかなかったため、CDKのソースコードを確認しました。そうするとCDK_DOCKER
という環境変数が利用でき、docker
以外のコマンドでも実行できるということがわかりました(一部抜粋)。
function dockerExec(args: string[], options?: SpawnSyncOptions) { const prog = process.env.CDK_DOCKER ?? 'docker'; const proc = spawnSync(prog, args, options ?? { stdio: [ // show Docker output 'ignore', // ignore stdio process.stderr, // redirect stdout to stderr 'inherit', // inherit stderr ], });
aws-cdk/bundling.ts at main · aws/aws-cdk
というわけで、docker
互換のコマンドとしてpodman
で実行できるのか、試してみました。
podmanをCDK_DOCKER環境変数で指定して実行してみる
まずはPodmanの環境を整えます。
$ brew install podman $ podman machine init $ podman machine start $ podman info host: arch: arm64 buildahVersion: 1.28.0 cgroupControllers: - cpu - io - memory - pids cgroupManager: systemd cgroupVersion: v2 conmon: package: conmon-2.1.5-1.fc37.aarch64 path: /usr/bin/conmon version: 'conmon version 2.1.5, commit: ' cpuUtilization: idlePercent: 34.31 systemPercent: 49.75 userPercent: 15.94 cpus: 1 distribution: distribution: fedora variant: coreos version: "37" eventLogger: journald hostname: localhost.localdomain idMappings: gidmap: - container_id: 0 host_id: 1000 size: 1 - container_id: 1 host_id: 100000 size: 1000000 uidmap: - container_id: 0 host_id: 502 size: 1 - container_id: 1 host_id: 100000 size: 1000000 kernel: 6.0.12-300.fc37.aarch64 linkmode: dynamic logDriver: journald memFree: 1253294080 memTotal: 2049785856 networkBackend: netavark ociRuntime: name: crun package: crun-1.7.2-1.fc37.aarch64 path: /usr/bin/crun version: |- crun version 1.7.2 commit: 0356bf4aff9a133d655dc13b1d9ac9424706cac4 rundir: /run/user/502/crun spec: 1.0.0 +SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +LIBKRUN +WASM:wasmedge +YAJL os: linux remoteSocket: exists: true path: /run/user/502/podman/podman.sock security: apparmorEnabled: false capabilities: CAP_CHOWN,CAP_DAC_OVERRIDE,CAP_FOWNER,CAP_FSETID,CAP_KILL,CAP_NET_BIND_SERVICE,CAP_SETFCAP,CAP_SETGID,CAP_SETPCAP,CAP_SETUID,CAP_SYS_CHROOT rootless: true seccompEnabled: true seccompProfilePath: /usr/share/containers/seccomp.json selinuxEnabled: true serviceIsRemote: true slirp4netns: executable: /usr/bin/slirp4netns package: slirp4netns-1.2.0-8.fc37.aarch64 version: |- slirp4netns version 1.2.0 commit: 656041d45cfca7a4176f6b7eed9e4fe6c11e8383 libslirp: 4.7.0 SLIRP_CONFIG_VERSION_MAX: 4 libseccomp: 2.5.3 swapFree: 0 swapTotal: 0 uptime: 0h 1m 35.00s plugins: authorization: null log: - k8s-file - none - passthrough - journald network: - bridge - macvlan volume: - local registries: search: - docker.io store: configFile: /var/home/core/.config/containers/storage.conf containerStore: number: 0 paused: 0 running: 0 stopped: 0 graphDriverName: overlay graphOptions: {} graphRoot: /var/home/core/.local/share/containers/storage graphRootAllocated: 106769133568 graphRootUsed: 2286723072 graphStatus: Backing Filesystem: xfs Native Overlay Diff: "true" Supports d_type: "true" Using metacopy: "false" imageCopyTmpDir: /var/tmp imageStore: number: 0 runRoot: /run/user/502/containers volumePath: /var/home/core/.local/share/containers/storage/volumes version: APIVersion: 4.3.1 Built: 1668178831 BuiltTime: Sat Nov 12 00:00:31 2022 GitCommit: "" GoVersion: go1.19.2 Os: linux OsArch: linux/arm64 Version: 4.3.1
次のコマンドで環境変数を設定します。
$ export CDK_DOCKER=podman
この状態で実行してみます。
$ npx cdk synth ... Supply a stack id (SampleStack) to display its template.
あっさり動いた!
まとめ
CDK_DOCKER
環境変数を指定することで問題なく動くようです。.bashrc
などにこの設定を追加しておけば問題なさそうですね。
なおnpm run test
は失敗しました。原因は書き込み権限のようで、以前書いたものと本質的には同じ問題のようです。
limaでは解決できましたが、Podmanで同様の設定方法がわかりませんでした。こちらも解決できたらブログでお伝えします。