@travetto/pack 4.0.0-rc.7 → 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
@@ -237,12 +237,22 @@ cd $TRV_OUT
237
237
  npx rollup -c $TRV_OUT/node_modules/@travetto/pack/support/rollup/build.js
238
238
  cd $ROOT
239
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
+
240
250
  # Generating Docker File $DIST/Dockerfile @travetto/pack/support/pack.dockerfile
241
251
 
242
252
  echo "Generating Docker File $DIST/Dockerfile @travetto/pack/support/pack.dockerfile"
243
253
 
244
254
  echo "FROM node:20-alpine" > $DIST/Dockerfile
245
- 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
246
256
  echo "RUN mkdir /app && chown app:app /app" >> $DIST/Dockerfile
247
257
  echo "COPY --chown=\"app:app\" . /app" >> $DIST/Dockerfile
248
258
  echo "ENV NODE_OPTIONS=\"\"" >> $DIST/Dockerfile
@@ -250,12 +260,6 @@ echo "USER app" >> $DIST/Dockerfile
250
260
  echo "WORKDIR /app" >> $DIST/Dockerfile
251
261
  echo "ENTRYPOINT [\"/app/todo-app.sh\"]" >> $DIST/Dockerfile
252
262
 
253
- # Pulling Docker Base Image node:20-alpine
254
-
255
- echo "Pulling Docker Base Image node:20-alpine"
256
-
257
- docker pull node:20-alpine
258
-
259
263
  # Building Docker Container latest
260
264
 
261
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.7",
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.6",
33
- "@travetto/terminal": "^4.0.0-rc.6",
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.6"
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
  */
@@ -17,12 +15,15 @@ export class PackConfigUtil {
17
15
  * Install docker pages in either apk or apt environments
18
16
  */
19
17
  static dockerPackageInstall(cfg: DockerPackConfig): string {
20
- const { packages } = cfg.dockerRuntime;
18
+ const { os, packages } = cfg.dockerRuntime;
21
19
  if (packages?.length) {
22
- return ifElse('RUN which apk',
23
- `apk --update add ${packages.join(' ')} && rm -rf /var/cache/apk/*`,
24
- `apt update && apt install -y ${packages.join(' ')} && rm -rf /var/lib/{apt,dpkg,cache,log}/`,
25
- );
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
+ }
26
27
  } else {
27
28
  return '';
28
29
  }
@@ -39,14 +40,18 @@ export class PackConfigUtil {
39
40
  * Setup docker user
40
41
  */
41
42
  static dockerUser(cfg: DockerPackConfig): string {
42
- const { user, group, uid, gid } = cfg.dockerRuntime;
43
- return [
44
- user !== 'root' ? ifElse(
45
- 'RUN which useradd',
46
- `groupadd --gid ${gid} ${group} && useradd -u ${uid} -g ${group} ${user}`,
47
- `addgroup -g ${gid} ${group} && adduser -D -G ${group} -u ${uid} ${user}`
48
- ) : '',
49
- ].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
+ }
50
55
  }
51
56
 
52
57
  /**
package/src/types.ts CHANGED
@@ -33,6 +33,7 @@ export type DockerPackConfig = {
33
33
  dockerPush?: boolean;
34
34
  dockerRegistry?: string;
35
35
  dockerRuntime: {
36
+ os?: 'alpine' | 'debian' | 'centos' | 'unknown';
36
37
  packages?: string[];
37
38
  folder: string;
38
39
  user: string;
@@ -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
  */
@@ -79,8 +79,9 @@ export class PackDockerCommand extends BasePackCommand {
79
79
  getOperations(): PackOperationShape<this>[] {
80
80
  return [
81
81
  ...super.getOperations(),
82
- DockerPackOperation.writeDockerFile,
83
82
  DockerPackOperation.pullDockerBaseImage,
83
+ DockerPackOperation.detectDockerImageOs,
84
+ DockerPackOperation.writeDockerFile,
84
85
  DockerPackOperation.buildDockerContainer,
85
86
  DockerPackOperation.pushDockerContainer
86
87
  ];