GitLab如何在node容器中运行命令?本地Docker运行差异解析
GitLab CI 中 node:latest 镜像执行脚本的原理
问题描述
我有如下.gitlab-ci.yml配置文件:
image: node:latest test: script: - npm install
该配置运行正常,但当我执行docker run --rm -it node:latest时,会进入Node.js的REPL交互环境,在此环境中无法识别npm命令,提示需在常规shell中运行。我原本以为GitLab会使用容器默认的shell,想知道它是否暗中通过传递/bin/bash或/bin/sh来获取可运行npm等命令的shell?
解答
没错,GitLab CI确实是通过指定shell来执行你的脚本命令的,并没有使用镜像默认的启动行为。
- GitLab Runner在启动容器时,会自动覆盖
node:latest镜像的默认ENTRYPOINT和CMD,指定用容器内的shell(通常是/bin/sh或者/bin/bash,具体取决于镜像包含的shell)来运行你在script里定义的命令。 - 你直接运行
docker run --rm -it node:latest时,会触发镜像默认的ENTRYPOINT(也就是node命令),直接进入REPL环境,自然没法执行npm这类shell命令。 - 你可以手动模拟GitLab CI的环境:执行
docker run --rm -it node:latest /bin/bash(如果镜像没有bash,就用/bin/sh),进入shell环境后就能正常执行npm install,和CI里的运行逻辑一致。
内容的提问来源于stack exchange,提问作者John Graham
相关产品推荐
相关产品推荐

