From d824cc9fe60bcd11bd2a9e3f17061490ce736812 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Mon, 16 Sep 2019 15:54:40 -0400 Subject: [PATCH 1/8] Support .dockerignore (faster Docker builds) --- packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 dde960bce475c..e963c0a1eea97 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -74,9 +74,18 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { if (!fs.existsSync(path.join(dir, 'Dockerfile'))) { throw new Error(`No 'Dockerfile' found in ${dir}`); } + + let excludes = []; + + const ignore = path.join(dir, '.dockerignore'); + + if(fs.existsSync(ignore)){ + excludes = fs.readFileSync(ignore).toString().split('\n').filter(e => !!e); + } const staging = new assets.Staging(this, 'Staging', { ...props, + exclude: excludes, sourcePath: dir }); @@ -123,4 +132,4 @@ function validateBuildArgs(buildArgs?: { [key: string]: string }) { throw new Error(`Cannot use tokens in keys or values of "buildArgs" since they are needed before deployment`); } } -} \ No newline at end of file +} From a77d0b7afc0791170af3c0fa205965e758edffc8 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Mon, 16 Sep 2019 19:46:16 -0400 Subject: [PATCH 2/8] ts fix --- packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e963c0a1eea97..163cf1742a1f1 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -75,7 +75,7 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { throw new Error(`No 'Dockerfile' found in ${dir}`); } - let excludes = []; + let excludes: string[] = []; const ignore = path.join(dir, '.dockerignore'); From da0b3eb36bf90c76d381c09644db2bd5a4b9d875 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Thu, 19 Sep 2019 13:40:28 -0400 Subject: [PATCH 3/8] test update and lint fix --- packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 4 ++-- .../@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore | 1 + packages/@aws-cdk/aws-ecr-assets/test/demo-image/foobar.txt | 0 packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 packages/@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore create mode 100644 packages/@aws-cdk/aws-ecr-assets/test/demo-image/foobar.txt 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 163cf1742a1f1..7ae104a6549d2 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -74,12 +74,12 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { if (!fs.existsSync(path.join(dir, 'Dockerfile'))) { throw new Error(`No 'Dockerfile' found in ${dir}`); } - + let excludes: string[] = []; const ignore = path.join(dir, '.dockerignore'); - if(fs.existsSync(ignore)){ + if (fs.existsSync(ignore)) { excludes = fs.readFileSync(ignore).toString().split('\n').filter(e => !!e); } diff --git a/packages/@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore b/packages/@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore new file mode 100644 index 0000000000000..b7c7139ddb1a4 --- /dev/null +++ b/packages/@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore @@ -0,0 +1 @@ +foobar.txt diff --git a/packages/@aws-cdk/aws-ecr-assets/test/demo-image/foobar.txt b/packages/@aws-cdk/aws-ecr-assets/test/demo-image/foobar.txt new file mode 100644 index 0000000000000..e69de29bb2d1d 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 b5b6da0249d06..af12c4244206f 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 @@ -177,6 +177,8 @@ export = { test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile'))); test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/index.py'))); + test.ok(!fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/foobar.txt'))); + test.done(); }, From fb9d82cfbf329e26454de8d7692c3ea2a969fefe Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Thu, 19 Sep 2019 15:33:12 -0400 Subject: [PATCH 4/8] exclude dockerignore so it does not influence hashing --- packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts | 12 ++++++------ .../@aws-cdk/aws-ecr-assets/test/test.image-asset.ts | 2 +- 2 files changed, 7 insertions(+), 7 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 7ae104a6549d2..68cab1673954c 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -1,11 +1,11 @@ import assets = require('@aws-cdk/assets'); import ecr = require('@aws-cdk/aws-ecr'); import cdk = require('@aws-cdk/core'); -import { Token } from '@aws-cdk/core'; +import {Token} from '@aws-cdk/core'; import cxapi = require('@aws-cdk/cx-api'); import fs = require('fs'); import path = require('path'); -import { AdoptedRepository } from './adopted-repository'; +import {AdoptedRepository} from './adopted-repository'; export interface DockerImageAssetProps extends assets.CopyOptions { /** @@ -75,12 +75,12 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { throw new Error(`No 'Dockerfile' found in ${dir}`); } - let excludes: string[] = []; + let excludes: string[] = ['.dockerignore']; const ignore = path.join(dir, '.dockerignore'); if (fs.existsSync(ignore)) { - excludes = fs.readFileSync(ignore).toString().split('\n').filter(e => !!e); + excludes = [...excludes, ...fs.readFileSync(ignore).toString().split('\n').filter(e => !!e)]; } const staging = new assets.Staging(this, 'Staging', { @@ -121,13 +121,13 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { // // If adoption fails (because the repository might be twice-adopted), we // haven't already started using the image. - this.repository = new AdoptedRepository(this, 'AdoptRepository', { repositoryName }); + this.repository = new AdoptedRepository(this, 'AdoptRepository', {repositoryName}); this.imageUri = `${this.repository.repositoryUri}@sha256:${imageSha}`; } } function validateBuildArgs(buildArgs?: { [key: string]: string }) { - for (const [ key, value ] of Object.entries(buildArgs || {})) { + for (const [key, value] of Object.entries(buildArgs || {})) { if (Token.isUnresolved(key) || Token.isUnresolved(value)) { throw new Error(`Cannot use tokens in keys or values of "buildArgs" since they are needed before deployment`); } 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 af12c4244206f..ebeb4b2b8ebee 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 @@ -175,7 +175,7 @@ export = { const session = app.synth(); - test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile'))); + test.ok(fs.existsSync(path.join(session.directory, `asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile`))); test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/index.py'))); test.ok(!fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/foobar.txt'))); From a61362be11901e419b949d8a6f8aa813a5851a44 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Fri, 20 Sep 2019 10:07:22 -0400 Subject: [PATCH 5/8] tweaks --- .../aws-ecr-assets/lib/image-asset.ts | 12 +++---- .../.dockerignore | 0 .../test/dockerignore-image/Dockerfile | 5 +++ .../foobar.txt | 0 .../test/dockerignore-image/index.py | 33 +++++++++++++++++++ .../aws-ecr-assets/test/test.image-asset.ts | 17 ++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) rename packages/@aws-cdk/aws-ecr-assets/test/{demo-image => dockerignore-image}/.dockerignore (100%) create mode 100644 packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/Dockerfile rename packages/@aws-cdk/aws-ecr-assets/test/{demo-image => dockerignore-image}/foobar.txt (100%) create mode 100644 packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/index.py 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 68cab1673954c..b4bcd1994d8a7 100644 --- a/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts +++ b/packages/@aws-cdk/aws-ecr-assets/lib/image-asset.ts @@ -1,11 +1,11 @@ import assets = require('@aws-cdk/assets'); import ecr = require('@aws-cdk/aws-ecr'); import cdk = require('@aws-cdk/core'); -import {Token} from '@aws-cdk/core'; +import { Token } from '@aws-cdk/core'; import cxapi = require('@aws-cdk/cx-api'); import fs = require('fs'); import path = require('path'); -import {AdoptedRepository} from './adopted-repository'; +import { AdoptedRepository } from './adopted-repository'; export interface DockerImageAssetProps extends assets.CopyOptions { /** @@ -75,17 +75,17 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { throw new Error(`No 'Dockerfile' found in ${dir}`); } - let excludes: string[] = ['.dockerignore']; + let exclude: string[] = ['.dockerignore']; const ignore = path.join(dir, '.dockerignore'); if (fs.existsSync(ignore)) { - excludes = [...excludes, ...fs.readFileSync(ignore).toString().split('\n').filter(e => !!e)]; + exclude = [...exclude, ...fs.readFileSync(ignore).toString().split('\n').filter(e => !!e)]; } const staging = new assets.Staging(this, 'Staging', { ...props, - exclude: excludes, + exclude, sourcePath: dir }); @@ -121,7 +121,7 @@ export class DockerImageAsset extends cdk.Construct implements assets.IAsset { // // If adoption fails (because the repository might be twice-adopted), we // haven't already started using the image. - this.repository = new AdoptedRepository(this, 'AdoptRepository', {repositoryName}); + this.repository = new AdoptedRepository(this, 'AdoptRepository', { repositoryName }); this.imageUri = `${this.repository.repositoryUri}@sha256:${imageSha}`; } } diff --git a/packages/@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/.dockerignore similarity index 100% rename from packages/@aws-cdk/aws-ecr-assets/test/demo-image/.dockerignore rename to packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/.dockerignore diff --git a/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/Dockerfile b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/Dockerfile new file mode 100644 index 0000000000000..123b5670febc8 --- /dev/null +++ b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3.6 +EXPOSE 8000 +WORKDIR /src +ADD . /src +CMD python3 index.py diff --git a/packages/@aws-cdk/aws-ecr-assets/test/demo-image/foobar.txt b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/foobar.txt similarity index 100% rename from packages/@aws-cdk/aws-ecr-assets/test/demo-image/foobar.txt rename to packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/foobar.txt diff --git a/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/index.py b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/index.py new file mode 100644 index 0000000000000..2ccedfce3ab76 --- /dev/null +++ b/packages/@aws-cdk/aws-ecr-assets/test/dockerignore-image/index.py @@ -0,0 +1,33 @@ +#!/usr/bin/python +import sys +import textwrap +import http.server +import socketserver + +PORT = 8000 + + +class Handler(http.server.SimpleHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header('Content-Type', 'text/html') + self.end_headers() + self.wfile.write(textwrap.dedent('''\ + + It works + +

Hello from the integ test container

+

This container got built and started as part of the integ test.

+ + + ''').encode('utf-8')) + + +def main(): + httpd = http.server.HTTPServer(("", PORT), Handler) + print("serving at port", PORT) + httpd.serve_forever() + + +if __name__ == '__main__': + main() 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 ebeb4b2b8ebee..325d624782068 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 @@ -182,6 +182,23 @@ export = { test.done(); }, + 'docker directory is staged without files specified in .dockerignore'(test: Test) { + const app = new App(); + const stack = new Stack(app, 'stack'); + + new DockerImageAsset(stack, 'MyAsset', { + directory: path.join(__dirname, 'dockerignore-image') + }); + + const session = app.synth(); + + test.ok(fs.existsSync(path.join(session.directory, `asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile`))); + test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/index.py'))); + test.ok(!fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/foobar.txt'))); + + test.done(); + }, + 'fails if using tokens in build args keys or values'(test: Test) { // GIVEN const stack = new Stack(); From 08fd07924a947b2bd0bdb7e134c0d1c0b625ef17 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Fri, 20 Sep 2019 10:08:12 -0400 Subject: [PATCH 6/8] remove verify from other test --- packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts | 1 - 1 file changed, 1 deletion(-) 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 325d624782068..04dfb7c585708 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 @@ -177,7 +177,6 @@ export = { test.ok(fs.existsSync(path.join(session.directory, `asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile`))); test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/index.py'))); - test.ok(!fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/foobar.txt'))); test.done(); }, From ee7b6b4f7d93252f220427721cfdd3c9eb1ed034 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Fri, 20 Sep 2019 10:08:30 -0400 Subject: [PATCH 7/8] revert --- packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 04dfb7c585708..6889540117346 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 @@ -175,7 +175,7 @@ export = { const session = app.synth(); - test.ok(fs.existsSync(path.join(session.directory, `asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile`))); + test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile'))); test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/index.py'))); test.done(); From b1a8fbb4db53bcb39cbc82395cc9aeb1005072d6 Mon Sep 17 00:00:00 2001 From: Paris Holley Date: Fri, 20 Sep 2019 10:08:49 -0400 Subject: [PATCH 8/8] more revert --- packages/@aws-cdk/aws-ecr-assets/test/test.image-asset.ts | 1 - 1 file changed, 1 deletion(-) 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 6889540117346..89d8a90193e88 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 @@ -177,7 +177,6 @@ export = { test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/Dockerfile'))); test.ok(fs.existsSync(path.join(session.directory, 'asset.1a17a141505ac69144931fe263d130f4612251caa4bbbdaf68a44ed0f405439c/index.py'))); - test.done(); },