выполнение команды dpkg в сборке docker в конвейере Дженкинса выдает сообщение «не удается получить доступ к архиву: такого файла или каталога нет».

#docker #jenkins-pipeline

Вопрос:

Я пытаюсь выполнить тесты Cypress E2E в конвейере Дженкинса. Для этого я пытаюсь создать образ Docker, а затем выполнить в нем команды оболочки. Это код из файла Dockerfile, который я использую:

 FROM jenkins/ssh-agent:latest
USER root
RUN apt-get update 
RUN apt install -y wget libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb fonts-liberation xdg-utils curl git
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
RUN mkdir -p /tmp amp;amp; cd /tmp
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb
 

Этот образ докера успешно создается, когда я запускаю его в конвейере в моем локальном Jenkins, но когда я пытаюсь запустить его в Jenkins на сервере, Chrome успешно загружается и сохраняется, но dpkg команда возвращает следующую ошибку: dpkg: error: cannot access archive 'google-chrome-stable_current_amd64.deb': No such file or directory
Вот весь журнал консоли:

 Step 1/9 : FROM jenkins/ssh-agent:latest
 ---> 4f81b94cdf9e
Step 2/9 : USER root
 ---> Using cache
 ---> e59a8cc73033
Step 3/9 : RUN apt-get update
 ---> Using cache
 ---> feaf1b0f2695
Step 4/9 : RUN apt install -y wget libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb fonts-liberation xdg-utils curl git
 ---> Using cache
 ---> a9decc4a3bee
Step 5/9 : ENV LANG C.UTF-8
 ---> Using cache
 ---> ea6fe6ebf772
Step 6/9 : ENV LC_ALL C.UTF-8
 ---> Using cache
 ---> b1830b029dba
Step 7/9 : RUN cd /tmp
 ---> Using cache
 ---> 19798a9eaaa3
Step 8/9 : RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
 ---> Running in 3c8d6e7085d3
--2021-10-15 13:36:22--  https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Resolving dl.google.com (dl.google.com)... 142.250.185.174, 2a00:1450:4001:810::200e
Connecting to dl.google.com (dl.google.com)|142.250.185.174|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 90229076 (86M) [application/x-debian-package]
Saving to: ‘google-chrome-stable_current_amd64.deb’

     0K .......... .......... .......... .......... ..........  0% 26.1M 3s
    50K .......... .......... .......... .......... ..........  0% 28.9M 3s
   100K .......... .......... .......... .......... ..........  0% 21.3M 3s
   150K .......... .......... .......... .......... ..........  0% 48.2M 3s
   200K .......... .......... .......... .......... ..........  0% 29.8M 3s
   250K .......... .......... .......... .......... ..........  0% 29.7M 3s
   300K .......... .......... .......... .......... ..........  0% 43.3M 3s
...
...
...
 87850K .......... .......... .......... .......... .......... 99%  241M 0s
 87900K .......... .......... .......... .......... .......... 99%  238M 0s
 87950K .......... .......... .......... .......... .......... 99%  181M 0s
 88000K .......... .......... .......... .......... .......... 99%  246M 0s
 88050K .......... .......... .......... .......... .......... 99%  244M 0s
 88100K .......... ....                                       100%  211M=0.6s

(147 MB/s) - ‘google-chrome-stable_current_amd64.deb’ saved [90229076/90229076]

Removing intermediate container 3c8d6e7085d3
 ---> 2c8e60b1b039
Step 9/9 : RUN dpkg -i google-chrome-stable_current_amd64.deb
 ---> Running in 60d2fbad1840
dpkg: error: cannot access archive 'google-chrome-stable_current_amd64.deb': No such file or directory
The command '/bin/sh -c dpkg -i google-chrome-stable_current_amd64.deb' returned a non-zero code: 2
 

Как вы можете видеть, в нем даже говорится, что .deb файл сохраняется, но когда я пытаюсь запустить его, dpkg теперь он доступен. Можете ли вы помочь мне, как это можно решить? Спасибо.

Ответ №1:

Во-первых, Dockerfile не выполняется как сценарий. Каждый RUN выполняется отдельно, как если бы вы открыли новый терминал, так что

 RUN cd /tmp
 

ничего не делает, потому что next RUN будет выполняться в рабочем каталоге, поэтому Google chrome загружается в /home/jenkins .

И ваша проблема в том, что по какой-то причине (скрипт.bashrc или что-то еще) очищает домашний каталог Дженкинса перед запуском оболочки. Итак, вы загружаете chrome, затем запускаете новую оболочку, она удаляет a .deb , и вы получаете сообщение об ошибке.

Простое исправление будет выглядеть следующим образом:

 RUN mkdir -p /tmp amp;amp; cd /tmp amp;amp; 
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb amp;amp; 
    dpkg -i google-chrome-stable_current_amd64.deb amp;amp; 
    rm google-chrome-stable_current_amd64.deb # remove .deb after installation
 

И чтобы на самом деле изменить рабочий каталог на /tmp , просто сделайте

 WORKDIR /tmp
 

Если каталог не существует, он будет создан (см. Ссылку на файл Dockerfile).

Комментарии:

1. спасибо вам за ваш быстрый ответ. кажется, работает безупречно!