В итоге я использовал контейнер Docker для установки модуля aws-cdk
в заданный путь c, а затем заархивировал контейнер и скопировал его в каталог, подключенный к привязке, чтобы он был доступен на базовом хосте .
Я построил проект с использованием Gradle и gradle-docker-plugin
Бена Мущко. Я не тратил время, пытаясь использовать меньшее изображение Node для ускорения сборки.
task createCdkDockerfile(type: Dockerfile) {
from 'node:latest'
defaultCommand('/bin/bash', '-c', "apt-get update && apt-get install -y zip && mkdir -p /nodejs && npm config set prefix /nodejs/bin && npm install -g aws-cdk && pushd /nodejs/bin && zip -r --symlinks /opt/aws-cdk.zip *")
}
task buildCdkImage(type:DockerBuildImage) {
dependsOn createCdkDockerfile
images.add('my-aws-cdk:latest')
}
ext.maybeConvertWindowsPath = { path ->
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
path = "/${path.replace("\\", "/").replace(":", "")}"
}
return path
}
task createCdkContainer(type: DockerCreateContainer) {
def dockerBindDir = new File(buildDir, "docker")
dockerBindDir.mkdirs()
dependsOn buildCdkImage
targetImageId buildCdkImage.getImageId()
hostConfig.autoRemove = true
hostConfig.binds = ["${maybeConvertWindowsPath(buildDir.toString())}/docker" : "/opt"]
}
task startCdkContainer(type: DockerStartContainer) {
dependsOn createCdkContainer
targetContainerId createCdkContainer.getContainerId()
}
task waitCdkContainer(type: DockerWaitContainer) {
dependsOn startCdkContainer
targetContainerId createCdkContainer.getContainerId()
}
Файл zip доступен по адресу ${buildDir}/docker/aws-cdk.zip
.
Добавление CDK в качестве слоя согласно примеру Nodejs в моем вопросе, что-то вроде этого:
LayerVersion nodeLayer = LayerVersion.Builder.create(this, "aws-cdk-layer")
.description("Layer containing AWS CDK")
.code(
Code.fromAsset(somePathTo-aws-cdk.zip)
)
.build();
Точки, на которые следует обратить внимание:
- , если основаны на Windows, молнии на Windows, тогда разархивирование на Linux вызовет проблемы с файлами, которые должны быть исполняемыми и больше не исполняемыми, т.е. сам
cdk
. - каталоги привязки при монтировании, кажется, имеют проблемы при Windows, поэтому возникает необходимость для очистки имени файла.
- при архивировании, важно использовать параметр
--symlinks
, иначе исполняемый файл cdk
не сможет найти файл cdk.js
.
Я бы предпочел использовать tar
для архивирования файла, но fromAsset()
не примет tar-файлы.