@travetto/pack 4.0.0-rc.6 → 4.0.0-rc.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -133,15 +133,16 @@ Options:
133
133
  -r, --rollup-configuration <string> Rollup configuration file (default: "@travetto/pack/support/rollup/build")
134
134
  --env-file <string> Env Flag File Name (default: ".env")
135
135
  --manifest-file <string> Manifest File Name (default: "manifest.json")
136
- -df, --docker-factory <string> Docker Factory source (default: "@travetto/pack/support/pack.dockerfile")
137
- -di, --docker-image <string> Docker Image to extend (default: "node:20-alpine")
138
- -dn, --docker-name <string> Docker Image Name (default: "travetto_pack")
139
- -dt, --docker-tag <string> Docker Image Tag (default: ["latest"])
140
- -dp, --docker-port <number> Docker Image Port (default: [])
141
- -dx, --docker-push Docker Push Tags (default: false)
136
+ -df, --docker-factory <string> Docker Factory source (default: "@travetto/pack/support/pack.dockerfile")
137
+ -di, --docker-image <string> Docker Image to extend (default: "node:20-alpine")
138
+ -dn, --docker-name <string> Docker Image Name (default: "travetto_pack")
139
+ -dt, --docker-tag <string> Docker Image Tag (default: ["latest"])
140
+ -dp, --docker-port <number> Docker Image Port (default: [])
141
+ -dx, --docker-push Docker Push Tags (default: false)
142
142
  -db, --docker-build-platform <string> Docker Build Platform
143
143
  -dr, --docker-registry <string> Docker Registry
144
- -du, --docker-runtime-user <string> Docker Runtime user
144
+ -ru, --runtime-user <string> Docker Runtime user
145
+ -rp, --runtime-package <string> Docker Runtime Packages (default: [])
145
146
  -m, --module <module> Module to run for
146
147
  -h, --help display help for command
147
148
  ```
@@ -236,12 +237,22 @@ cd $TRV_OUT
236
237
  npx rollup -c $TRV_OUT/node_modules/@travetto/pack/support/rollup/build.js
237
238
  cd $ROOT
238
239
 
240
+ # Pulling Docker Base Image node:20-alpine
241
+
242
+ echo "Pulling Docker Base Image node:20-alpine"
243
+
244
+ docker pull node:20-alpine
245
+
246
+ # Detected Image OS node:20-alpine as alpine
247
+
248
+ echo "Detected Image OS node:20-alpine as alpine"
249
+
239
250
  # Generating Docker File $DIST/Dockerfile @travetto/pack/support/pack.dockerfile
240
251
 
241
252
  echo "Generating Docker File $DIST/Dockerfile @travetto/pack/support/pack.dockerfile"
242
253
 
243
254
  echo "FROM node:20-alpine" > $DIST/Dockerfile
244
- echo "RUN which useradd && (groupadd --gid 2000 app && useradd -u 2000 -g app app) || (addgroup -g 2000 app && adduser -D -G app -u 2000 app)" >> $DIST/Dockerfile
255
+ echo "RUN addgroup -g 2000 app && adduser -D -G app -u 2000 app" >> $DIST/Dockerfile
245
256
  echo "RUN mkdir /app && chown app:app /app" >> $DIST/Dockerfile
246
257
  echo "COPY --chown=\"app:app\" . /app" >> $DIST/Dockerfile
247
258
  echo "ENV NODE_OPTIONS=\"\"" >> $DIST/Dockerfile
@@ -249,12 +260,6 @@ echo "USER app" >> $DIST/Dockerfile
249
260
  echo "WORKDIR /app" >> $DIST/Dockerfile
250
261
  echo "ENTRYPOINT [\"/app/todo-app.sh\"]" >> $DIST/Dockerfile
251
262
 
252
- # Pulling Docker Base Image node:20-alpine
253
-
254
- echo "Pulling Docker Base Image node:20-alpine"
255
-
256
- docker pull node:20-alpine
257
-
258
263
  # Building Docker Container latest
259
264
 
260
265
  echo "Building Docker Container latest"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@travetto/pack",
3
- "version": "4.0.0-rc.6",
3
+ "version": "4.0.0-rc.8",
4
4
  "description": "Code packing utilities",
5
5
  "keywords": [
6
6
  "travetto",
@@ -29,12 +29,12 @@
29
29
  "@rollup/plugin-json": "^6.1.0",
30
30
  "@rollup/plugin-node-resolve": "^15.2.3",
31
31
  "@rollup/plugin-terser": "^0.4.4",
32
- "@travetto/base": "^4.0.0-rc.5",
33
- "@travetto/terminal": "^4.0.0-rc.5",
32
+ "@travetto/base": "^4.0.0-rc.7",
33
+ "@travetto/terminal": "^4.0.0-rc.7",
34
34
  "rollup": "^4.9.6"
35
35
  },
36
36
  "peerDependencies": {
37
- "@travetto/cli": "^4.0.0-rc.5"
37
+ "@travetto/cli": "^4.0.0-rc.7"
38
38
  },
39
39
  "peerDependenciesMeta": {
40
40
  "@travetto/cli": {
@@ -1,7 +1,5 @@
1
1
  import { DockerPackConfig } from './types';
2
2
 
3
- const ifElse = (check: string, succ: string, fail: string): string => `${check} && (${succ}) || (${fail})`;
4
-
5
3
  /**
6
4
  * Common utils for setting up pack config
7
5
  */
@@ -13,6 +11,24 @@ export class PackConfigUtil {
13
11
  return `FROM ${cfg.dockerImage}`;
14
12
  }
15
13
 
14
+ /**
15
+ * Install docker pages in either apk or apt environments
16
+ */
17
+ static dockerPackageInstall(cfg: DockerPackConfig): string {
18
+ const { os, packages } = cfg.dockerRuntime;
19
+ if (packages?.length) {
20
+ switch (os) {
21
+ case 'alpine': return `RUN apk --update add ${packages.join(' ')} && rm -rf /var/cache/apk/*`;
22
+ case 'debian': return `RUN apt update && apt install -y ${packages.join(' ')} && rm -rf /var/lib/{apt,dpkg,cache,log}/`;
23
+ case 'centos': return `RUN yum -y install ${packages.join(' ')} && yum -y clean all && rm -fr /var/cache`;
24
+ case 'unknown':
25
+ default: throw new Error('Unable to install packages in an unknown os');
26
+ }
27
+ } else {
28
+ return '';
29
+ }
30
+ }
31
+
16
32
  /**
17
33
  * Setup docker ports
18
34
  */
@@ -24,14 +40,18 @@ export class PackConfigUtil {
24
40
  * Setup docker user
25
41
  */
26
42
  static dockerUser(cfg: DockerPackConfig): string {
27
- const { user, group, uid, gid } = cfg.dockerRuntime;
28
- return [
29
- user !== 'root' ? ifElse(
30
- 'RUN which useradd',
31
- `groupadd --gid ${gid} ${group} && useradd -u ${uid} -g ${group} ${user}`,
32
- `addgroup -g ${gid} ${group} && adduser -D -G ${group} -u ${uid} ${user}`
33
- ) : '',
34
- ].join('\n');
43
+ const { os, user, group, uid, gid } = cfg.dockerRuntime;
44
+ if (user === 'root') {
45
+ return '';
46
+ } else {
47
+ switch (os) {
48
+ case 'alpine': return `RUN addgroup -g ${gid} ${group} && adduser -D -G ${group} -u ${uid} ${user}`;
49
+ case 'debian':
50
+ case 'centos': return `RUN groupadd --gid ${gid} ${group} && useradd -u ${uid} -g ${group} ${user}`;
51
+ case 'unknown':
52
+ default: throw new Error('Unable to add user/group for an unknown os');
53
+ }
54
+ }
35
55
  }
36
56
 
37
57
  /**
@@ -79,6 +99,7 @@ export class PackConfigUtil {
79
99
  return [
80
100
  this.dockerPorts(cfg),
81
101
  this.dockerUser(cfg),
102
+ this.dockerPackageInstall(cfg),
82
103
  this.dockerAppFolder(cfg),
83
104
  this.dockerAppFiles(cfg),
84
105
  this.dockerEnvVars(cfg),
package/src/types.ts CHANGED
@@ -33,6 +33,8 @@ export type DockerPackConfig = {
33
33
  dockerPush?: boolean;
34
34
  dockerRegistry?: string;
35
35
  dockerRuntime: {
36
+ os?: 'alpine' | 'debian' | 'centos' | 'unknown';
37
+ packages?: string[];
36
38
  folder: string;
37
39
  user: string;
38
40
  uid: number;
@@ -14,6 +14,18 @@ export class DockerPackOperation {
14
14
  return (cfg.dockerTag ?? []).map(x => cfg.dockerRegistry ? `${cfg.dockerRegistry}/${cfg.dockerName}:${x}` : `${cfg.dockerName}:${x}`);
15
15
  }
16
16
 
17
+ /**
18
+ * Detect image os
19
+ */
20
+ static async* detectDockerImageOs(cfg: DockerPackConfig): AsyncIterable<string[]> {
21
+ // Read os before writing
22
+ cfg.dockerRuntime.os = await PackUtil.runCommand(
23
+ ['docker', 'run', '--entrypoint', '/bin/sh', cfg.dockerImage, '-c', 'cat /etc/*release*']
24
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
25
+ ).then(out => out.match(/\b(?:debian|alpine|centos)\b/i)?.[0].toLowerCase() as 'alpine' ?? 'unknown');
26
+ yield* PackOperation.title(cfg, cliTpl`${{ title: 'Detected Image OS' }} ${{ param: cfg.dockerImage }} as ${{ param: cfg.dockerRuntime.os }}`);
27
+ }
28
+
17
29
  /**
18
30
  * Write Docker File
19
31
  */
@@ -15,25 +15,27 @@ const DEFAULT_USER = 'app';
15
15
  */
16
16
  @CliCommand({ addModule: true })
17
17
  export class PackDockerCommand extends BasePackCommand {
18
- @CliFlag({ desc: 'Docker Factory source ', short: 'df', envVars: ['PACK_DOCKER_FACTORY'] })
18
+ @CliFlag({ desc: 'Docker Factory source', short: 'df', envVars: ['PACK_DOCKER_FACTORY'] })
19
19
  dockerFactory = '@travetto/pack/support/pack.dockerfile';
20
- @CliFlag({ desc: 'Docker Image to extend ', short: 'di', envVars: ['PACK_DOCKER_IMAGE'] })
20
+ @CliFlag({ desc: 'Docker Image to extend', short: 'di', envVars: ['PACK_DOCKER_IMAGE'] })
21
21
  dockerImage = `node:${NODE_MAJOR}-alpine`;
22
- @CliFlag({ desc: 'Docker Image Name ', short: 'dn', envVars: ['PACK_DOCKER_IMAGE'] })
22
+ @CliFlag({ desc: 'Docker Image Name', short: 'dn', envVars: ['PACK_DOCKER_IMAGE'] })
23
23
  @Required(false)
24
24
  dockerName: string;
25
- @CliFlag({ desc: 'Docker Image Tag ', short: 'dt', envVars: ['PACK_DOCKER_TAGS'] })
25
+ @CliFlag({ desc: 'Docker Image Tag', short: 'dt', envVars: ['PACK_DOCKER_TAGS'] })
26
26
  dockerTag: string[] = ['latest'];
27
- @CliFlag({ desc: 'Docker Image Port ', short: 'dp', envVars: ['PACK_DOCKER_PORT'] })
27
+ @CliFlag({ desc: 'Docker Image Port', short: 'dp', envVars: ['PACK_DOCKER_PORT'] })
28
28
  dockerPort: number[] = [];
29
- @CliFlag({ desc: 'Docker Push Tags ', short: 'dx', envVars: ['PACK_DOCKER_PUSH'] })
29
+ @CliFlag({ desc: 'Docker Push Tags', short: 'dx', envVars: ['PACK_DOCKER_PUSH'] })
30
30
  dockerPush = false;
31
- @CliFlag({ desc: 'Docker Build Platform ', short: 'db', envVars: ['PACK_DOCKER_BUILD_PLATFORM'] })
31
+ @CliFlag({ desc: 'Docker Build Platform', short: 'db', envVars: ['PACK_DOCKER_BUILD_PLATFORM'] })
32
32
  dockerBuildPlatform?: string;
33
- @CliFlag({ desc: 'Docker Registry ', short: 'dr', envVars: ['PACK_DOCKER_REGISTRY'] })
33
+ @CliFlag({ desc: 'Docker Registry', short: 'dr', envVars: ['PACK_DOCKER_REGISTRY'] })
34
34
  dockerRegistry?: string;
35
- @CliFlag({ desc: 'Docker Runtime user ', short: 'du', name: 'docker-runtime-user', envVars: ['PACK_DOCKER_RUNTIME_USER'] })
35
+ @CliFlag({ desc: 'Docker Runtime user', short: 'ru', name: 'runtime-user', envVars: ['PACK_DOCKER_RUNTIME_USER'] })
36
36
  dockerRuntimeUserSrc?: string;
37
+ @CliFlag({ desc: 'Docker Runtime Packages', short: 'rp', name: 'runtime-package', envVars: ['PACK_DOCKER_RUNTIME_PACKAGES'] })
38
+ dockerRuntimePackages: string[] = [];
37
39
 
38
40
  @Ignore()
39
41
  dockerRuntime: DockerPackConfig['dockerRuntime'];
@@ -67,7 +69,7 @@ export class PackDockerCommand extends BasePackCommand {
67
69
  const gid = groupIsNum ? +groupOrGid : DEFAULT_USER_ID;
68
70
  const group = (!groupIsNum ? groupOrGid : undefined) || DEFAULT_USER;
69
71
  const user = (!userIsNum ? userOrUid : undefined) || DEFAULT_USER;
70
- this.dockerRuntime = { user, uid, group, gid, folder: `/${DEFAULT_USER}` };
72
+ this.dockerRuntime = { user, uid, group, gid, folder: `/${DEFAULT_USER}`, packages: this.dockerRuntimePackages };
71
73
  }
72
74
 
73
75
  preHelp(): void {
@@ -77,8 +79,9 @@ export class PackDockerCommand extends BasePackCommand {
77
79
  getOperations(): PackOperationShape<this>[] {
78
80
  return [
79
81
  ...super.getOperations(),
80
- DockerPackOperation.writeDockerFile,
81
82
  DockerPackOperation.pullDockerBaseImage,
83
+ DockerPackOperation.detectDockerImageOs,
84
+ DockerPackOperation.writeDockerFile,
82
85
  DockerPackOperation.buildDockerContainer,
83
86
  DockerPackOperation.pushDockerContainer
84
87
  ];