MultiStage Docker Изображение - PullRequest
0 голосов
/ 07 апреля 2020

Я создал многоступенчатый dockerfile.

FROM dot-portal.de.pri.o2.com:8079/centos:centos7 as base

# Install a basic SSH server GIT, UNZIP, LSOF and JDK 8

ADD myrepo.repo /etc/yum.repos.d/myrepo.repo

RUN rm -rf /etc/yum.repos.d/CentOS*

COPY docker /opt/docker

RUN  yum repolist refresh && yum clean all && yum repolist && yum install -y openssh-server git unzip lsof epel-release bzip2 fontconfig && yum clean all && rm -rf /var/cache/yum && cd /opt/docker && rpm -ivh *.rpm && rm -rf /opt/docker

ADD docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

RUN ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# update sshd settings, create jenkins user, set jenkins user pw, generate ssh keys
RUN sed -i 's|session    required     pam_loginuid.so|session    optional     pam_loginuid.so|g' /etc/pam.d/sshd \
    && mkdir -p /var/run/sshd \
    && useradd -u 1000 -m -s /bin/bash jenkins \
    && echo "jenkins:jenkins" | chpasswd \
    && usermod -aG wheel jenkins \
    && /usr/bin/ssh-keygen -A \
    && sed -i "s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g" /etc/ssh/sshd_config \
    && sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
    && echo export JAVA_HOME="/`alternatives  --display java | grep best | cut -d "/" -f 2-6`" >> /etc/environment \
    && usermod -a -G docker jenkins \
        && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd


RUN git config --global http.sslVerify false && mkdir -p /opt/app/jenkins

COPY --chown=jenkins:jenkins jenkins_tools /opt/app/jenkins/jenkins_tools/

ADD node-v10.13.0-linux-x64.tar.gz /opt/app/jenkins/jenkins_tools

ENV CI_TOOLS_HOME /opt/app/jenkins/jenkins_tools

ENV ARCH Linux-x86_64
ENV CI_TOOLS_HOME /opt/app/jenkins/jenkins_tools
ENV JAVA_HOME /usr/java/jdk1.8.0_241-amd64/

COPY dot-portal.de.pri.o2.com.crt $CI_TOOLS_HOME/dot-portal.de.pri.o2.com.crt
RUN cd $CI_TOOLS_HOME && echo yes | keytool -importcert -file dot-portal.de.pri.o2.com.crt -alias "dot-portal.de.pri.o2.com" -keystore "$JAVA_HOME/jre/lib/security/cacerts" -storepass changeit

COPY --chown=jenkins:jenkins authorized_keys /home/jenkins/.ssh/

RUN mkdir /root/.ssh && mkdir -p /opt/app/home/jenkins && chown -R jenkins:jenkins /opt/app/home/jenkins

COPY dockerslave /etc/default/docker

RUN ln -s $CI_TOOLS_HOME/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/bin/ && chown -R jenkins:jenkins /opt/app/jenkins/jenkins_tools

FROM base
COPY --from=base /opt/app/jenkins/jenkins_tools /opt/app/jenkins/jenkins_tools
COPY --from=base /etc/default/docker /etc/default/docker
COPY --from=base /usr/bin/phantomjs /usr/bin/phantomjs

ENV CI_TOOLS_HOME /opt/app/jenkins/jenkins_tools
ENV ARCH Linux-x86_64
ENV CI_TOOLS_HOME /opt/app/jenkins/jenkins_tools
ENV JAVA_HOME /usr/java/jdk1.8.0_241-amd64/
ENV MAVEN_HOME /opt/app/jenkins/jenkins_tools/nonarch/maven-3.3.9
RUN echo "export PATH=$CI_TOOLS_HOME/node-v10.13.0-linux-x64/bin/:$CI_TOOLS_HOME/phantomjs-2.1.1-linux-x86_64/bin/:$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH" >> ~/.bashrc

# Standard SSH port
EXPOSE 22

CMD ["/usr/sbin/sshd", "-D", "-e"]

Мой вопрос: пакет и пользователь, которого я установил / создал в базовом образе, не будут отражаться в итоговом изображении. Только из базы я создаю окончательное изображение, но когда я подключаюсь к контейнеру, я не вижу пользователя "jenkins", созданного в базовом образе, и пакеты также отсутствуют.

1 Ответ

0 голосов
/ 07 апреля 2020

Чего вы пытаетесь достичь с помощью многоступенчатой ​​docker сборки здесь? Если ваш второй этап начинается с результата первого этапа в сборке с двумя этапами, вы также можете иметь только один этап ...

Обычно используются многоэтапные сборки, потому что один использует первый этап (например, " builder ") для создания какого-либо артефакта, который требует много инструментов разработки. На втором этапе только этот артефакт будет скопирован в небольшое базовое изображение, чтобы получить конечное изображение, которое очень мало, поскольку не содержит инструментов, необходимых для создания артефакта.

Пример из docker docs :

FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]  

В вашем случае я почти уверен, что ваше окончательное изображение содержит пользователя jenkins, потому что ваш второй этап начинается с базового этапа. Однако эти команды копирования, которые копируют из базового образа, будут сбрасывать разрешения на root на вашем втором этапе:

COPY --from=base /opt/app/jenkins/jenkins_tools /opt/app/jenkins/jenkins_tools
COPY --from=base /etc/default/docker /etc/default/docker
COPY --from=base /usr/bin/phantomjs /usr/bin/phantomjs

Эти команды копирования избыточны, так как вы все равно запускаете FROM base. Если вы удалите эти строки, каталог jenkins_tools будет правильно принадлежать пользователю jenkins.

Обратите внимание, что вы можете изменить пользователя, который используется для выполнения команд во время сборки docker, с помощью USER <username>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...