在 Gitlab-runner docker 容器中安装包

Install package inside a Gitlab-runner docker container

我有一个项目的 Gitlab-ci 配置,我想将 src 内带有 .less 扩展名的文件复制到 dist,维护它们的路径。为此,我使用:

find .  -name '*.less' -exec rsync -R {} ../dist ';' 

我安装了 gitlab-运行ner 镜像:

docker pull gitlab/gitlab-runner:latest

并且 运行 它与:

  docker run -d --name gitlab_runner --restart always \
    -v /srv/gitlab-runner/config:/etc/gitlab-runner \
    -v /var/run/docker.sock:/var/run/docker.sock \
    gitlab/gitlab-runner:latest

并注册:

  docker run --rm -t -i -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

docker作为执行人——也许这很重要——。

这是我项目的结构:

.
├── .gitignore
├── .gitlab-ci.yml
├── README.md
├── package.json
├── dist
├── src
│   ├── components
│   │   └── MyComponent
│   │       ├── Loader.less
│   │       └── Loader.tsx
│   └── index.tsx
└── tsconfig.json

这是我的 package.json:

{
  "name": "@me/components",
  "version": "0.0.0",
  "description": "Components library",
  "scripts": {
    "build": "tsc -d && cd src && find .  -name '*.less' -exec rsync -R {} ../dist ';' && cd ..",
  },
  "devDependencies": {
    "typescript": "^3.6.2",
    "react-dom": "^16.9.0"
  },
  "dependencies": {
    "prop-types": "^15.7.2",
    "react": "^16.9.0",
  }
}

这是我的 .gitlab-ci.yml 文件:

image: node:latest

stages:
  - install
  - build

install:
  stage: install
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist

如你所见,gitlab 运行ner 将 运行 npm run build,其中有以下行:

"build": "tsc -d && cd src && find .  -name '*.less' -exec rsync -R {} ../dist ';' && cd ..",

问题是我得到了这个输出:

$ npm run build

> @me/components@0.0.0 build /builds/me/components
> tsc -d && cd src && find .  -name '*.less' -exec rsync -R {} ../dist ';' && cd ..

find: 'rsync': No such file or directory
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory

我想这是因为linux版本的gitlab运行nerdocker镜像没有rsync.

如果我在 运行 docker exec -it 9387492637 bash 时进入 docker 容器,我可以尝试 运行 cd src && find . -name '*.less' -exec rsync -R {} ../dist ';' && cd ..

root@239f8a797:/test#  cd src && find .  -name '*.less' -exec rsync -R {} ../dist ';' && cd ..
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory

如果我尝试安装 rsync,它会失败:

root@239f8a797:/test# apt-get install rsync
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package rsync

难道是因为gitlab-运行ner镜像中没有安装rsync?是因为执行人?我该如何解决这个问题?

谢谢!

我建议在扩展图像中添加 rsync,如果不包含 rsync,则使用该图像而不是官方图像,否则您每次都需要 docker exec

FROM gitlab/gitlab-runner:latest
RUN apt-get update -y && \
apt-get install rsync -y

或者另一种选择是

docker exec -it 9387492637 bash -c "apt-get update -y && apt-get install rsync -y"

更新: 从@zeehio 的回答中,我也认为 nodejs 有问题。所以你可以按照@zeehio的方法,或者你也可以使用这种方法。

FROM node:latest
RUN apt-get update -y && \
apt-get install rsync -y

或者我会建议使用比 node:latest

更轻的 alpine based nodejs 图像
FROM node:alpine
RUN apk add --no-cache rsync

奖金:

您在 80MB.

中获得了 nodejs、npm 和 rsync

节点:最新

node:latest907MB,大约是 alpine 的 9 倍。

对我来说 node:latest 图像似乎没有 rsync。您可以在脚本运行前安装 rsync

before_script:
  - apt-get update -qq && apt-get install -y -qq rsync

或者您的 .gitlab-ci.yml 完整:

image: node:latest

stages:
  - install
  - build

install:
  stage: install
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

build:
  stage: build
  before_script:
    - apt-get update -qq && apt-get install -y -qq rsync
  script:
    - npm run build
  artifacts:
    paths:
      - dist