在Gitlab runner docker容器中安装包

在Gitlab runner docker容器中安装包,docker,gitlab,gitlab-ci,devops,gitlab-ci-runner,Docker,Gitlab,Gitlab Ci,Devops,Gitlab Ci Runner,我有一个项目的Gitlab ci配置,我想将.less扩展名在src中的文件复制到dist,维护它们的路径。为此,我使用: find . -name '*.less' -exec rsync -R {} ../dist ';' 我安装gitlab runner映像时使用了: docker pull gitlab/gitlab-runner:latest 并使用以下工具运行它: docker run -d --name gitlab_runner --restart always \

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

find .  -name '*.less' -exec rsync -R {} ../dist ';' 
我安装gitlab runner映像时使用了:

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
这是my 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 runner将运行
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 runner docker映像没有
rsync

如果在使用
docker exec-it 9387492637 bash运行时输入docker容器,我可以尝试运行
cd src&&find-名称'*.less'-execrsync-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 runner映像中没有安装
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-answer,我也认为nodejs有问题。所以你可以遵循@zeehio的方法,也可以使用这种方法

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

或者我建议使用
基于阿尔卑斯山的nodejs
图像,它比
node:latest

FROM node:alpine
RUN apk add --no-cache rsync
奖金:

您只需80MB即可获得NodeJ、npm和rsync

节点:最新的


node:latest
907MB,大约是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

谢谢@adii!我使用了@zeehio的答案,但我也会尝试实现这个答案。