@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 +19 -14
- package/package.json +4 -4
- package/src/config-util.ts +31 -10
- package/src/types.ts +2 -0
- package/support/bin/docker-operation.ts +12 -0
- package/support/cli.pack_docker.ts +14 -11
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
|
|
137
|
-
-di, --docker-image <string> Docker Image to extend
|
|
138
|
-
-dn, --docker-name <string> Docker Image Name
|
|
139
|
-
-dt, --docker-tag <string> Docker Image Tag
|
|
140
|
-
-dp, --docker-port <number> Docker Image Port
|
|
141
|
-
-dx, --docker-push Docker Push Tags
|
|
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
|
-
-
|
|
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
|
|
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.
|
|
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.
|
|
33
|
-
"@travetto/terminal": "^4.0.0-rc.
|
|
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.
|
|
37
|
+
"@travetto/cli": "^4.0.0-rc.7"
|
|
38
38
|
},
|
|
39
39
|
"peerDependenciesMeta": {
|
|
40
40
|
"@travetto/cli": {
|
package/src/config-util.ts
CHANGED
|
@@ -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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
`addgroup -g ${gid} ${group} && adduser -D -G ${group} -u ${uid} ${user}
|
|
33
|
-
|
|
34
|
-
|
|
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
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
25
|
+
@CliFlag({ desc: 'Docker Image Tag', short: 'dt', envVars: ['PACK_DOCKER_TAGS'] })
|
|
26
26
|
dockerTag: string[] = ['latest'];
|
|
27
|
-
@CliFlag({ desc: 'Docker Image Port
|
|
27
|
+
@CliFlag({ desc: 'Docker Image Port', short: 'dp', envVars: ['PACK_DOCKER_PORT'] })
|
|
28
28
|
dockerPort: number[] = [];
|
|
29
|
-
@CliFlag({ desc: 'Docker Push Tags
|
|
29
|
+
@CliFlag({ desc: 'Docker Push Tags', short: 'dx', envVars: ['PACK_DOCKER_PUSH'] })
|
|
30
30
|
dockerPush = false;
|
|
31
|
-
@CliFlag({ desc: '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
|
|
33
|
+
@CliFlag({ desc: 'Docker Registry', short: 'dr', envVars: ['PACK_DOCKER_REGISTRY'] })
|
|
34
34
|
dockerRegistry?: string;
|
|
35
|
-
@CliFlag({ desc: '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
|
];
|