CDKではCDK_DOCKER環境変数を指定することで任意のコマンドでDockerビルドができる

こんにちは。サービス部の武田です。CDKではCDK_DOCKER環境変数を指定することで任意のコマンドでDockerビルドが可能なようです。
2022.12.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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で同様の設定方法がわかりませんでした。こちらも解決できたらブログでお伝えします。