在Gitlab-runner docker容器中安装软件包

时间:2019-09-12 13:12:58

标签: 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 \
    -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运行程序将运行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

我想这是因为gitlabRunner docker映像的Linux版本没有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-runner映像中未安装rsync吗?是因为执行者?我该如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果不包含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

或者我建议使用alpine based nodejs图像,比node:latest轻得多

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

奖金:

您仅在 80MB 中获得了nodejs,npm和rsync。

node:latest

node:latest 907MB ,大​​约是高山的9倍。

答案 1 :(得分:0)

在我看来,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