Зависимости, установленные с помощью Dockerfile, недоступны на более поздних этапах конвейера. Как включить?

В настоящее время используется Jenkins Blue Ocean, чтобы попытаться настроить новый конвейер. Это проект на основе узлов, и я успешно запускаю npm install в Dockerfile, однако на последующих этапах конвейера не отображается установленный node_modules. Это довольно странное поведение.

Jenkinsfile.

pipeline {
  agent {
    dockerfile {
      filename 'Dockerfile.prod'
    }
  }
  stages {
    stage('Test') {
      steps {
        sh 'ls node_modules'
      }
    }
  }
}

Dockerfile.prod

FROM node:8

ADD . /var/www    
WORKDIR /var/www
RUN ["npm", "install"]

Во время сборки Dockerfile:

Step 4/4 : RUN ["npm", "install"]

 ---> Running in de3cd138a40e
...
added 1283 packages in 39.842s

Removing intermediate container de3cd138a40e

На этапе test файла Jenkins:

+ ls node_modules

ls: cannot access node_modules: No such file or directory

person Dmitri Farkov    schedule 29.12.2018    source источник
comment
Я никогда не использовал эту настройку, но уверены ли вы, что ваша ls node_nodules команда выполняется внутри контейнера? Ваш Dockerfile устанавливает все зависимости внутри образа Docker, и поэтому они недоступны снаружи без запуска контейнера.   -  person Igor Nikolaev    schedule 29.12.2018
comment
Спасибо за ответ, @IgorNikolaev! Итак, согласно найденным здесь документам jenkins.io/doc/book/pipeline/ syntax / # agent-example, если агент dockerfile определен на корневом уровне, все этапы должны выполняться в нем .. Я попытался установить ENV внутри Dockerfile, и когда я запускаю шаг sh, он повторяет правильное значение. Странность.   -  person Dmitri Farkov    schedule 30.12.2018


Ответы (1)


Проблема решена. После того, как Дженкинс скомпилирует исходный файл докеров, он правильно запустит его на последующих этапах конвейера. Однако, если просмотреть журналы заданий (не в представлении blueocean), можно увидеть, что Дженкинс затем переопределяет WORKDIR при запуске контейнера docker run -t -d -u 1000:1000 -w /var/jenkins_home/workspace/workspace_name. Следовательно, необходимо вручную перейти к ожидаемому WORKDIR.

person Dmitri Farkov    schedule 30.12.2018
comment
Согласно документации, вы также можете предоставить дополнительные args при создании контейнера. Итак, вы можете попробовать установить WORKDIR динамически. Для этого вам нужно будет определить переменную среды, которую вы затем можете присвоить WORKDIR. Но документация Docker (docs.docker.com/engine/reference/builder/#workdir) говорит, что вы можете использовать только переменную среды, явно заданную в Dockerfile, но вы можете использовать ARG для передачи значения для ENV :) - person Igor Nikolaev; 31.12.2018
comment
Но это также будет означать, что вы не сможете повторно использовать образ для последующей сборки, если не установите модули узлов глобально. - person Igor Nikolaev; 31.12.2018
comment
Конечно, похоже, что если вы попытаетесь передать -w jenkins, то это будет иметь приоритет, поскольку это будет позже. Хотелось бы, чтобы это было настраиваемым, но я видел несколько открытых проблем, поэтому надеюсь, что это будет решено. - person Dmitri Farkov; 31.12.2018
comment
@ dmitri-farkov что именно ты сделал? Потому что я пытался передать аргументы докеру, но это не сработало. - person Angelina; 22.01.2021