Новый образ докера из работающего контейнера не содержит обновленных значений

Я использовал образ докера Jenkins из dockerhub (https://github.com/jenkinsci/docker)

FROM jenkins/jenkins:lts
USER root
ENV http_proxy http://bc-proxy-vip.de.pri.o2.com:8080
ENV https_proxy http://bc-proxy-vip.de.pri.o2.com:8080
RUN apt-get update
RUN apt-get install -y ldap-utils curl wget vim nano sudo
RUN adduser jenkins sudo
User jenkins
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/ref/plugins.txt
EXPOSE 8080
EXPOSE 50000

Команда сборки докера была успешно выполнена, и контейнер также успешно запущен.

Команда сборки докера:

docker build --no-cache -t myjenkins .

Команда контейнера Docker:

docker run --net=host --name=my_jenkins -d -p 8080:8080 -p 50000:50000 myjenkins

Затем я вошел в Jenkins GUI, создал нового пользователя и обновил плагины.

Затем создал новый образ с помощью команды docker commit. Идентификатор основного изображения — c068f8d9a060. Идентификатор вновь созданного образа докера — de0789b77703.

docker commit c052fd7a26b3 almjenkins:version1
root@vagrant-ubuntu-trusty:~/jenkins# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
almjenkins          version1            de0789b77703        13 minutes ago      1.04GB
myjenkins           latest              c068f8d9a060        4 hours ago         1.03GB

Я выполнил команду docker run, чтобы запустить Jenkins из моего нового образа.

docker run --net=host --name=alm_jenkins -d -p 8080:8080 -p 50000:50000 almjenkins:version1

Когда я получил доступ к графическому интерфейсу Jenkins, я не могу найти обновления в новом изображении.


person user2439278    schedule 12.01.2018    source источник
comment
Docker не будет фиксировать изменения, внесенные в том, вам необходимо сохранить данные из тома докера извне.   -  person Tarun Lalwani    schedule 12.01.2018
comment
Я обновил свои плагины, настроил данные прокси в менеджере плагинов. Как получить эти обновления и обновить их в новом образе.   -  person user2439278    schedule 12.01.2018
comment
Вы можете использовать docker cp для получения данных из /var/jenkins_home из существующего контейнера.   -  person Tarun Lalwani    schedule 12.01.2018


Ответы (1)


Как описано в официальной документации для фиксации docker:

Операция фиксации не будет включать данные, содержащиеся в томах, смонтированных внутри контейнера.

jenkins_home, который содержит всю конфигурацию jenkins, объявлен как том в Dockerfile для jenkins. Таким образом, команда фиксации не будет включать конфигурацию can (задания, узлы, плагины...)

Решение состоит в том, чтобы создать настроенный образ докера, который включает в себя конфигурацию.

FROM jenkins/jenkins

COPY jobs /usr/share/jenkins/ref/jobs/
RUN /usr/local/bin/install-plugins.sh workflow-aggregator:2.5 ... # Install all the plugins that you need

Вы можете извлечь папку заданий из старого контейнера и добавить ее в новый:

docker cp <container-name>:/var/jenkins_home/jobs jobs
person yamenk    schedule 12.01.2018
comment
В моем случае я создал образ докера Jenkins и выполнил все обновления плагинов, создал задание, настройки безопасности ldap, и этот контейнер jenkin действует как основной сервер. Теперь мне нужно создать еще один докер Jenkins из обновленного. Нужно ли копировать все файлы, связанные с Jenkins, с тома Docker на том HOST? - person user2439278; 12.01.2018
comment
@user2439278 user2439278 Для заданий просто скопируйте папку заданий под /var/jenkins_home/jobs и поместите ее в новое изображение. Что касается плагинов, я предлагаю вам поместить нужную версию в Dockerfile и пересобрать образ. - person yamenk; 12.01.2018
comment
чтобы восстановить образ, мне нужно написать файл Dockerfile, который содержит имя нового образа докера, и настроить образ. Как насчет настройки безопасности LDAP, реализованной в основном контейнере Jenkins. Как я могу достичь? Мне нужна точная копия работающего контейнера в качестве нового образа. Могу ли я продолжить команду сохранения Docker - person user2439278; 12.01.2018
comment
Вы можете скопировать весь jenkins_home из старого контейнера и поместить его в новый образ. Это эффективно даст вам контейнер, идентичный старому. Кроме того, для LDAP вы можете настроить его с помощью сценария инициализации, который будет выполняться после запуска контейнера; вы можете создать LDAPSecurityRealm и установить его в экземпляре Jenkins. Если у вас много настроек, достаточно просто скопировать jenkins_home в новый образ. - person yamenk; 12.01.2018