From a50fd94aacc1c97e3e9e1e6405967d4795003bf1 Mon Sep 17 00:00:00 2001 From: Nathan Peck Date: Tue, 28 Jan 2020 18:31:20 -0500 Subject: [PATCH 1/3] Don't leave Dockerfile or .dockerignore out or the assets folder if in the .dockerignore file --- package.json | 2 ++ packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 12 ++++++++++++ packages/@aws-cdk/aws-ecr-assets/package.json | 8 ++++++-- .../test/dockerignore-image/.dockerignore | 2 ++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0f639e7cddfdc..6680f86abf1b3 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,8 @@ "**/jszip/**", "@aws-cdk/assets/minimatch", "@aws-cdk/assets/minimatch/**", + "@aws-cdk/aws-ecr-assets/minimatch", + "@aws-cdk/aws-ecr-assets/minimatch/**", "@aws-cdk/cx-api/semver", "@aws-cdk/cx-api/semver/**", "@aws-cdk/cx-api/semver/**", diff --git a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts index 3a0cd48f2315c..5c93780b30b4c 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -2,6 +2,7 @@ import * as assets from '@aws-cdk/assets'; import * as ecr from '@aws-cdk/aws-ecr'; import { Construct, Stack, Token } from '@aws-cdk/core'; import * as fs from 'fs'; +import * as minimatch from 'minimatch'; import * as path from 'path'; export interface DockerImageAssetProps extends assets.FingerprintOptions { @@ -95,6 +96,17 @@ export class DockerImageAsset extends Construct implements assets.IAsset { exclude = [...exclude, ...fs.readFileSync(ignore).toString().split('\n').filter(e => !!e)]; } + // .dockerignore files allow you to ignore the Dockerfile and .dockerignore file + // so that these files do not get sent to the Daemon during COPY or ADD. The + // files are still utilized by the Docker daemon, even if they are ignored + // We need to copy these files into the asset folder, even if they + // are included in the .dockerignore, so that these files can be used during the + // docker build, so remove any excludes that would match these two essential files + exclude = exclude.filter(ignoreExpression => { + return !(minimatch('Dockerfile', ignoreExpression, { dot: true }) || + minimatch('.dockerignore', ignoreExpression, { dot: true })); + }); + if (props.repositoryName) { this.node.addWarning(`DockerImageAsset.repositoryName is deprecated. Override "core.Stack.addDockerImageAsset" to control asset locations`); } diff --git a/packages/@aws-cdk/aws-ecr-assets/package.json b/packages/@aws-cdk/aws-ecr-assets/package.json index 6ff08f792c51b..14c817f4c176c 100644 --- a/packages/@aws-cdk/aws-ecr-assets/package.json +++ b/packages/@aws-cdk/aws-ecr-assets/package.json @@ -77,7 +77,8 @@ "@aws-cdk/aws-lambda": "1.22.0", "@aws-cdk/aws-s3": "1.22.0", "@aws-cdk/core": "1.22.0", - "@aws-cdk/cx-api": "1.22.0" + "@aws-cdk/cx-api": "1.22.0", + "minimatch": "^3.0.4" }, "homepage": "https://github.com/aws/aws-cdk", "peerDependencies": { @@ -96,10 +97,13 @@ "engines": { "node": ">= 10.3.0" }, + "bundledDependencies": [ + "minimatch" + ], "stability": "experimental", "awslint": { "exclude": [ "docs-public-apis:@aws-cdk/aws-ecr-assets.DockerImageAssetProps" ] } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/.dockerignore b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/.dockerignore index b7c7139ddb1a4..dfc250f466807 100644 --- a/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/.dockerignore +++ b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/.dockerignore @@ -1 +1,3 @@ foobar.txt +Dockerfile +.dockerignore From 85ea3ab7ef309e99bf2e653f43c7538a6f9684d7 Mon Sep 17 00:00:00 2001 From: Nathan Peck Date: Wed, 29 Jan 2020 11:08:56 -0500 Subject: [PATCH 2/3] Ensure that custom Dockerfile names never get excluded from assets --- .../@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 4 ++-- .../demo-image-custom-docker-file/.dockerignore | 1 + .../aws-ecr-assets/test/test.image-asset.ts | 14 +++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 packages/@aws-cdk/aws-ecr-assets/test/demo-image-custom-docker-file/.dockerignore diff --git a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts index 5c93780b30b4c..728b29ff6bcce 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -103,8 +103,8 @@ export class DockerImageAsset extends Construct implements assets.IAsset { // are included in the .dockerignore, so that these files can be used during the // docker build, so remove any excludes that would match these two essential files exclude = exclude.filter(ignoreExpression => { - return !(minimatch('Dockerfile', ignoreExpression, { dot: true }) || - minimatch('.dockerignore', ignoreExpression, { dot: true })); + return !(minimatch(file, ignoreExpression, { matchBase: true }) || + minimatch(ignore, ignoreExpression, { matchBase: true })); }); if (props.repositoryName) { diff --git a/packages/@aws-cdk/aws-ecr-assets/test/demo-image-custom-docker-file/.dockerignore b/packages/@aws-cdk/aws-ecr-assets/test/demo-image-custom-docker-file/.dockerignore new file mode 100644 index 0000000000000..255c0c9473e80 --- /dev/null +++ b/packages/@aws-cdk/aws-ecr-assets/test/demo-image-custom-docker-file/.dockerignore @@ -0,0 +1 @@ +Dockerfile.Custom \ No newline at end of file diff --git a/packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts b/packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts index d704c3f00f5c7..fa3da5605c892 100644 --- a/packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts @@ -297,13 +297,13 @@ export = { const asset6 = new DockerImageAsset(stack, 'Asset6', { directory, extraHash: 'random-extra' }); const asset7 = new DockerImageAsset(stack, 'Asset7', { directory, repositoryName: 'foo' }); - test.deepEqual(asset1.sourceHash, '31959f03fcdf1bddec1420d315dddedfccf559e87e95c85854a01f2cac103fc8'); - test.deepEqual(asset2.sourceHash, 'a42cd51ab2bc5e2a4399c4bc41f7df761ff19877b54bce52d69c6e8d628f16fd'); - test.deepEqual(asset3.sourceHash, '9efbc91d5c2f43782e49b27e784caad32d8619a0cecf806a6e55cf70f1cfbc22'); - test.deepEqual(asset4.sourceHash, '2907224e59cb720ba5810a624f1c1267f547377e8a23c50d72286dd81dc8435e'); - test.deepEqual(asset5.sourceHash, 'd718928111c650564240141b156188ebdbb93d3c5f1448dd1afe823ae7f742a5'); - test.deepEqual(asset6.sourceHash, 'fe3ef82c91b6321ac17bc3a14c75845fa1ddbafe550e0a04d5cf680015903a2d'); - test.deepEqual(asset7.sourceHash, '80f586ed82faacec8a285dd99c7ee52e06525fee1721bc80bc846d1a8266fe36'); + test.deepEqual(asset1.sourceHash, 'b5d181eb114c889020f9d59961ac4ad5d65f49c571c0aafd5ce2be9464bc2d13'); + test.deepEqual(asset2.sourceHash, '273bd9a95dbe346ad5b116736d44a350e90f57e2b9ba7fd3d334b61d0420f9fd'); + test.deepEqual(asset3.sourceHash, '14874d82ff027d94386817023bda8f80655d6f0d967df8b47c0146d770e9a059'); + test.deepEqual(asset4.sourceHash, 'c36b98c10fe2994b639dcd6028dbd7a2138bee0e2a8d3a3d20e8f7785e64aca9'); + test.deepEqual(asset5.sourceHash, '30e083bf51483a031759bc7fb35f69345de69fdbc511eec88bd3d1724b5ac0a9'); + test.deepEqual(asset6.sourceHash, '486729da8c28c8363ba1c42cd6c1ed0c23b1ae4bf81fd9fde51c6bac9dce5fcb'); + test.deepEqual(asset7.sourceHash, '0b48fa3f7f75365962e6e18f52608ec4e4451f8ecc0b58abdb063c5381569471'); test.done(); } }; From 7aeb2810560eaa9f492020a7f1bc6703629e1713 Mon Sep 17 00:00:00 2001 From: Nathan Peck Date: Wed, 29 Jan 2020 11:10:06 -0500 Subject: [PATCH 3/3] Making explanatory comment less verbose --- packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts index 728b29ff6bcce..6ace07dd1871f 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -96,12 +96,8 @@ export class DockerImageAsset extends Construct implements assets.IAsset { exclude = [...exclude, ...fs.readFileSync(ignore).toString().split('\n').filter(e => !!e)]; } - // .dockerignore files allow you to ignore the Dockerfile and .dockerignore file - // so that these files do not get sent to the Daemon during COPY or ADD. The - // files are still utilized by the Docker daemon, even if they are ignored - // We need to copy these files into the asset folder, even if they - // are included in the .dockerignore, so that these files can be used during the - // docker build, so remove any excludes that would match these two essential files + // make sure the docker file and the dockerignore file end up in the staging area + // see https://github.com/aws/aws-cdk/issues/6004 exclude = exclude.filter(ignoreExpression => { return !(minimatch(file, ignoreExpression, { matchBase: true }) || minimatch(ignore, ignoreExpression, { matchBase: true }));