::: IT인터넷 :::

Docker로 Scala 빌드머신 만들기 (1) - Dockerfile 작성

곰탱이푸우 2023. 8. 10. 08:20
Scala 개발환경 구성이 완료되면 작성한 Application을 빌드하고 배포해야 한다.
이전에 Jenkins로 Python과 Docker 빌드/배포 환경을 구축한 방법을 활용하여 Scala Application의 빌드 머신을 생성한다.
Jenkins의 SSH Agent 컨테이너의 Dockerfile과 sbt를 활용하여 리눅스 기반의 Scala 빌드 에이전트를 생성한다.
생성한 빌드 에이전트는 SSH 통신을 이용하여 Jenkins에 에이전트로 등록한다.
 
진행 순서는 다음과 같다.
  • Jenkins SSH 에이전트 이미지 생성 Dockerfile 작성
  • Dockerfile 빌드에 필요한 외부 파일 다운로드와 폴더 구성
  • Jenkins 에이전트 이미지 빌드와 배포
 
Python 빌드 머신 생성 방법은 아래 글을 참고한다.
Docker 빌드 머신 생성 방법은 아래 글을 참고한다.
빌드 시스템은 Jenkins를 사용한다.
Jenkins 구성 방법은 아래 글을 참고한다.
Dockerfile을 작성하여 Docker로 빌드할 것이므로 Docker가 설치되어 있어야 한다.
 
 

전체 파일 구성

Scala 빌드 머신의 전체 파일 구조는 크게 세 부분으로 구성된다.
  • Dockerfile - Docker 이미지 생성 스크립트
  • Jenkins 연동을 위한 에이전트
  • 빌드머신 구성에 필요한 환경 설정
 
빌드머신 구성에 필요한 환경 설정 파일들은 다음과 같이 구성된다.
  • apt 설정 - 우분투 apt 패키지 설정
  • sbt 설정 - sbt 실행에 필요한 설정
  • ssh 설정 - Jenkins 연동을 위한 ssh 관련 파일
  • 설치 파일 - 빌드 머신에 설치할 deb 파일
  • 테스트 파일 - 기본 라이브러리 다운로드를 위한 임시 build.sbt 파일
 
위와 같은 기준으로 정리한 전체 파일 구조는 다음과 같다.
각 항목별 설명은 주석을 참고한다.
\data
    \apt_conf\etc\apt
        \sources.list    # apt 저장소 설정
    \sbt_conf
        \etc\sbt
            \sbtopts    # sbt 설정 (저장소, 인증서 관련)
        \home\jenkins\
            \.sbt
                \credentials    # 배포 저장소 인증 정보
                \credentials.sbt    # 배포 저장소 인증 설정
                \nexus-url    # 배포할 sbt 저장소 목록
                \repositories    # sbt 저장소 목록
            \.ssh
                \authorized_keys    # 인증 정보 저장 파일
            \certs    # 자체서명인증서인 경우
                \output.cert    # 사설 저장소 서버 인증서
                \rootca.crt    # 사설 저장소 서버 rootca 인증서
            \test
                \build.sbt    # 기본 라이브러리 로드를 위한 build.sbt 예제
    \sbt_install\home\jenkins
        \sbt-1.9.0.deb    # sbt 1.9.0 설치 파일
Dockerfile    # Docker 이미지 빌드를 위한 Dockerfile
setup-sshd    # Jenkins Agent 연동을 위한 setup-sshd
version    # Docker 이미지 버전과 배포 정보

 

 

Dockerfile 작성

Jenkins SSH 에이전트 이미지 생성을 위한 Dockerfile을 작성한다.
 
Jenkins에서 ssh-agent Docker 이미지를 제공한다.
GitHub에 공개 된 소스코드는 다음과 같다.
해당 Docker 이미지를 사용하는 대신 Dockerfile 자체를 수정해서 사용한다.
ssh-agent의 Dockerfile은 MIT 라이선스이므로 라이선스 명시만 유지하면 자유롭게 코드 수정이 가능하다.
Dockerfile 중간에 필요한 프로그램을 설치하고, 최종적으로 setup-sshd가 실행되도록 구성한다.
 
자세한 내용은 아래 문서를 참고한다.

기본 이미지 환경 설정

Dockerfile이 사용할 기본 이미지와 변수명들을 설정한다.
FROM abis.ahnlab.com/ubuntu:20.04    # 기본 이미지

ARG user=jenkins    # 기본 사용자 계정
ARG group=jenkins    # 기본 사용자 그룹
ARG uid=1000    # 기본 사용자 계정의 UID
ARG gid=1000    # 기본 사용자 그룹의 GID
ARG JENKINS_AGENT_HOME=/home/${user}    # 기본 사용자 계정의 Home 경로
ARG DEBIAN_FRONTEND=noninteractive    # apt 설치할때 사용자 입력 생략

ENV JENKINS_AGENT_HOME ${JENKINS_AGENT_HOME}    # Jenkins의 Home 경로를 환경 변수로 등록
ENV TZ=Asia/Seoul    # 타임존을 서울로 지정

# 우분투에 사용자(jenkins) 그룹과 계정 추가, Home 경로 설정
RUN groupadd -g ${gid} ${group} \
    && useradd -d "${JENKINS_AGENT_HOME}" -u "${uid}" -g "${gid}" -m -s /bin/bash "${user}"
 
JDK 1.8 버전을 사용할 예정이므로 openjdk:8-jdk-buster를 사용하면 된다.
그러나 이번 문서에서는 로컬에서 테스트한 환경과 동일하게 맞추기 위해 Ubuntu 이미지를 사용했다.
JDK 1.8은 apt를 통해 openjdk 1.8 버전을 설치한다.
ARG DEBIAN_FRONTEND=noninteractive 옵션은 apt 설치할 때 사용자의 입력을 생략한다는 의미이다.
일부 패키지의 경우 설치하면서 사용자의 동의나 선택을 요구하는 경우, Docker 이미지 빌드에 사람이 개입해야 한다.
 
해당 옵션을 통해 사용자 입력을 생략하고 기본 선택으로 진행할 수 있다.
그러나 권장 사항은 아니므로 아래 글을 참고하여 사용 여부를 결정한다.

apt 설정 파일과 sbt 설치 파일 복사

우분투 컨테이너에 apt 업데이트 설정 파일과 sbt 설치 파일을 복사한다.
## 에이전트의 apt 설정파일을 복사한다.
# ./data/apt_conf/etc/apt/sources.list /etc/apt/

COPY ./data/apt_conf /

## sbt 설치 파일을 복사한다.
# COPY ./data/sbt_install/home/jenkins/sbt-1.9.0.deb /

COPY ./data/sbt_install /
 
각 파일들의 역할은 다음과 같다.
  • apt 업데이트 설정 파일은 apt 저장소를 변경하기 위해 기존 파일을 덮어쓴다.
  • sbt 설치 파일은 1.9.0 버전의 deb 파일을 사용하며 설치 이후 삭제한다.
 
경로를 구분하는 폴더의 하위 경로는 컨테이너 내부와 동일하게 구성한다.
 
 

apt 패키지 설치와 권한 부여

apt 패키지와 sbt를 설치하고, jenkins 계정에 sudo 권한을 부여한다.
## 필요한 apt package 목록들을 install한다.
RUN apt-get clean && apt-get autoremove && apt-get update \
    # SSH 통신을 위한 openssh-server 설치
    && apt-get install --no-install-recommends -y openssh-server \   
    # 컨테이너 관리와 sbt 빌드를 위한 패키지 설치
    && apt-get install apt-utils sudo build-essential locales vim openjdk-8-jdk curl git -y \
    && rm -rf /var/lib/apt/lists/* \
    && rm /etc/localtime \
    && ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime \
    # sbt 1.9.0 버전 설치와 deb 파일 삭제
    && dpkg -i ${JENKINS_AGENT_HOME}/sbt-1.9.0.deb \   
    && rm ${JENKINS_AGENT_HOME}/sbt-1.9.0.deb

## jenkins 계정에 sudo 권한 부여
# sudo 그룹에 jenkins 계정 추가
RUN adduser ${user} sudo \
    # sudo 명령을 비밀번호 없이 사용
    && echo "%sudo ALL=(ALL) NOPASSWD:ALL" >> /etc/sudeoers \
    # jenkins 계정 홈 경로 권한 변경
    && chmod a+rwx ${JENKINS_AGENT_HOME}
 
Jenkins 연동, 컨테이너 관리, sbt 빌드를 위한 apt 패키지를 설치한다.
  • Jenkins 연동 - openssh-server
  • 컨테이너 관리 - apt-utils, sudo, build-essential, locales, vim
  • sbt 빌드 - openjdk-8-jdk, curl, git
그리고 sbt 1.9.0 버전을 설치하고 설치에 사용한 sbt-1.9.0 파일을 삭제한다.
 
curl이 추가 된 부분이 이전 Python 빌드머신과 다르다.
sbt publish 또는 sbt package를 실행했을때 로컬에 sbt-launcher.jar가 없으면 curl을 이용하여 다운로드를 시도한다.
미리 curl이 설치되어 있지 않으면 다운로드 오류가 발생한다.
이러한 이유로 curl을 설치하는 내용이 추가되었다.
 
이후 jenkins 계정에 sudo 권한을 부여하고, 비밀번호 없이 sudo 명령을 사용할 수 있도록 설정한다.
jenkins 계정의 홈 경로 권한을 읽기, 쓰기, 실행이 모두 가능하도록 변경한다.
해당 권한은 이후 ssh 설정 과정에서 소유자만 가능하도록 변경한다.

 

 

sbt 설정 파일 복사

sbt 설정 파일을 복사한다.
## 에이전트의 sbt 설정파일을 복사한다.
# COPY ./data/sbt_conf/etc/sbt/sbtopts /etc/sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/credentials /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/credentials.sbt /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/nexus-url /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/repositories /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.ssh/authorized_keys /home/jenkins/.ssh/
# COPY ./data/sbt_conf/home/jenkins/certs /home/jenkins/certs
# COPY ./data/sbt_conf/home/jenkins/test/build.sbt /home/jenkins/test/

# sbtopts 파일 복사
COPY ./data/sbt_conf/etc/sbt/sbtopts /etc/sbt/
# jenkins 계정과 jenkins 그룹 권한으로 sbt 설정 파일 복사
COPY --chown=${user}:${group} ./data/sbt_conf/home/jenkins/ ${JENKINS_AGENT_HOME}/
 
복사하는 파일들은 etc 경로와 jenkins 계정의 Home 경로로 구분한다.
  • /etc/sbt 경로 - sbtopts 파일
  • /home/jenkins/.sbt 경로 - credentials, credentials.sbt, nexus-url, repositories
  • /home/jenkins/.ssh 경로 - authorized_keys
  • /home/jenkins/test 경로 - build.sbt
 
.sbt 경로에 생성하는 파일은 다음과 같이 구성된다.
  • Nexus 저장소에 업로드하기 위한 설정 정보 - credentials, credentials.sbt, nexus-url
  • sbt 라이브러리 다운로드를 위한 설정 정보 - repositories
 
해당 파일들의 내용은 아래 포스팅을 참고한다.

Java와 sbt 관련 환경 변수 등록

Java와 sbt에 필요한 환경 변수를 등록한다.
자세한 내용은 아래 코드의 주석을 참고한다.
ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"    # JDK 8 경로
ENV PATH="${JAVA_HOME}/bin:${PATH}"    # PATH 환경 변수에 JDK 8 경로 추가
ENV SBT_OPTS="-Dsbt.override.build.repos=true"    # 사용자가 지정한 sbt 저장소 사용
ENV GIT_SSL_NO_VERIFY=0    # GitLab의 HTTPS 인증서 검증 안함

 

자체 서명 인증서의 경우 발급기관 (CA) 목록에 포함되어 있지 않아 git clone 명령어를 실행할 때 인증서 오류가 발생한다.
따라서 GitLab의 HTTPS 인증서 검증 옵션도 비활성화 한다.
 

자체 서명 인증서 관련 설정

JVM과 sbt에서 Nexus 서버에 적용된 자체 서명 인증서를 인식할 수 있도록 설정한다.
## 자체서명 인증서 JVM에 등록
RUN keytool -importcert -trustcacerts \
    -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit \
    -file ${JENKINS_AGENT_HOME}/certs/output.cert -alias 서버주소-1 -noprompt \
    && keytool -importcert -trustcacerts \
    -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit \
    -file ${JENKINS_AGENT_HOME}/certs/rootca.crt -alias 서버주소 -noprompt \
    && rm -rf ${JENKINS_AGENT_HOME}/certs

## 자체서명 인증서를 사용한 경우 아래 옵션 추가 (아래 내용을 한줄로 작성)
ENV SBT_OPTS="${SBT_OPTS} -Dmaven.wagon.https.ssl.insecure=true \ 
              -Dmaven.wagon.https.ssl.allowall=true \
              -Dmaven.wagon.http.ssl.ignore.validity.dates=true \
              -Djavax.net.ssl.trustStore=$JAVA_HOME/jre/lib/security/cacerts \
              -Djavax.net.ssl.trustStorePassword=changeit"
Java 는 KeyStore 라는 인터페이스를 통해 암호화, 복호화, 디지털 서명에 사용되는 공개키, 개인키, 인증서를 추상화하여 제공한다.
자체 서명 인증서를 Java가 인식할 수 있도록 Java의 Keystore에 등록한다.
서버에 사용한 자체 서명 인증서와 해당 인증서 서명에 사용한 RootCA 인증서까지 함께 등록해야 한다.
 
자세한 내용은 아래 문서를 참고한다.
또한 sbt에서 인증서 검증을 해제하는 옵션을 추가한다.
Maven의 경우 3.0.5 버전부터 https의 인증서 검증 옵션이 기본으로 활성화되었다.
인증서 도용을 통한 Man-in-the-Middle 공격을 방어하기 위한 것이 목적이다.
아래 내용을 참고한다.
자체 서명 인증서는 해당 인증서를 검증할 수 있는 대상이 없다.
이러한 이유로 Nexus에 접근할때마다 항상 인증서 검증 오류가 발생하는 문제가 발생한다.
해당 오류를 회피하기 위해 인증서 검증을 해제하는 옵션을 사용한다.
 
Nexus의 Maven 저장소에 자체 서명 인증서를 적용하는 방법은 아래 문서를 참고한다.
로컬 sbt 환경에서 자체 서명 인증서 검증을 해제하는 방법은 아래 문서를 참고한다.

ssh 설정 관련 권한 변경

Jenkins는 SSH를 이용하여 해당 빌드머신과 통신을 수행한다.
해당 빌드머신을 Jenkins의 빌드 에이전트로 등록하기 위해, jenkins 계정의 소유자와 권한을 변경한다.
## ssh 설정 파일 소유자와 권한 설정
# /home/jenkins, /home/jenkins/.ssh 폴더 소유자 변경
RUN chown ${user} ${JENKINS_AGENT_HOME} \
    && chown -R ${user} ${JENKINS_AGENT_HOME}/.ssh \
# /home/jenkins, /home/jenkins/.ssh 폴더 권한 변경 (700)
    && chmod 700 ${JENKINS_AGENT_HOME} \
    && chmod -R 700 ${JENKINS_AGENT_HOME}/.ssh
 
Jenkins에서 SSH를 이용하여 빌드 에이전트와 통신하기 위해 필요한 설정은 다음과 같다.
 
폴더 소유자 변경
Jenkins의 빌드머신 연동에서 연결할 계정을 jenkins로 지정하는 경우 아래 폴더의 소유자와 일치해야 한다.
  • /home/jenkins
  • /home/jenkins/.ssh
Dockerfile로 진행하면 기본 소유자가 root로 설정되므로 명시적으로 소유자를 변경했다.
 
SSH 관련 파일과 폴더 권한 변경
기본적으로 폴더와 파일을 생성하면 아래와 같이 권한이 부여된다.
  • 폴더 - 755 (rwxr-xr-x)
  • 파일 - 644 (rx-r--r--)
 
그러나 Jenkins에서 SSH로 빌드머신에 연결하기 위한 폴더와 파일의 권한은 다음과 같다.
  • 폴더는 700 (rwx------) - /home/jenkins, /home/jenkins/.ssh
  • 파일은 600 (rw-------) - /home/jenkins/.ssh/authorized_keys

 

따라서 위의 조건에 맞게 권한을 변경한다.
위의 내용은 아래 문서를 참고한다.

sbt 기본 라이브러리 다운로드

Spark Application에 필요한 기본적인 build.sbt 파일을 사용하여 sbt와 Spark 기본 라이브러리를 다운로드한다.
 
프록시 환경인 경우 아래 코드를 참고한다.
USER ${user}

RUN export http_proxy=http://프록시서버IP:포트 \
    && export https_proxy=http://프록시서버IP:포트 \
    && export no_proxy=*.bearpooh.com,192.168.*,172.*,10.*,localhost,[::1] \
    && /bin/bash -c "cd ~/test && sbt update && rm -rf ~/test" \
    && unset http_proxy && unset https_proxy && unset no_proxy
 
프록시 환경이 아닌 경우 아래 코드를 참고한다.
USER ${user}

RUN /bin/bash -c "cd ~/test && sbt update && rm -rf ~/test"
 
Spark Application을 빌드하기 위해서는 sbt 관련 기본 라이브러리와 spark-core, spark-sql 라이브러리가 반드시 필요하다.
해당 라이브러리가 사용하는 하위 라이브러리의 개수가 상당히 많다. (의존 관계라고 표현한다.)
 
어플리케이션을 빌드할 때마다 새로 다운로드하면 굉장히 시간이 오래 걸리는 문제가 발생한다.
따라서 공통으로 사용하는 라이브러리를 미리 받아두는 것이 여러모로 시간을 절약하는데 도움이 된다.
build.sbt 파일은 이후 어플리케이션 빌드에 사용하는 것은 아니기에 라이브러리 다운로드 이후 삭제한다.
 
build.sbt 관련 내용은 아래 문서의 build.sbt 수정 항목을 참고한다.
또한 프록시 사용이 가능한 폐쇄망 환경인 경우 sbt-launcher.jar 파일을 다운로드하기 위해 임시로 프록시 설정을 적용한다.
sbt-launcher 다운로드 이후 라이브러리는 내부 저장소를 통해 받기 때문에 프록시 설정이 필요없다.
따라서 라이브러리 다운로드가 완료되면 프록시 설정도 해제한다.
 
 

Jenkins 연동을 위한 setup-sshd 설정

Jenkins에 빌드 에이전트로 연결하기 위해 필요한 부분이다.
ssh 설정 파일인 sshd_config의 내용을 수정한다.
그리고 setup-sshd 파일을 복사하고 실행한다.
 
자세한 내용은 아래 코드의 주석을 참고한다.
USER root

RUN sed -i /etc/ssh/sshd_config \
        # root 계정 로그인 비활성화
        -e 's/#PermitRootLogin.*/PermitRootLogin no/' \
        # 계정으로 인증 활성화
        -e 's/#RSAAuthentication.*/RSAAuthentication yes/'  \
        # 암호 입력 비활성화 (authorized_keys 사용)
        -e 's/#PasswordAuthentication.*/PasswordAuthentication no/' \
        # SSH 로그 설정 (기본값인 AUTH와 INFO 사용)
        -e 's/#SyslogFacility.*/SyslogFacility AUTH/' \
        -e 's/#LogLevel.*/LogLevel INFO/' \
    && mkdir /var/run/sshd

# 휘발성 정보를 보존하기 위한 VOLUME 생성
VOLUME "${JENKINS_AGENT_HOME}" "/tmp" "/run" "/var/run"
# Docker 컨테이너의 기본 작업 경로 지정 (/home/jenkins)
WORKDIR "${JENKINS_AGENT_HOME}"

# setup-sshd 파일을 /usr/local/bin 경로로 복사
COPY setup-sshd /usr/local/bin/setup-sshd
# /usr/local/bin 경로를 PATH 환경변수에 추가 (모든 경로에서 실행 가능)
ENV PATH /usr/local/bin:$PATH
# 복사한 setup-sshd 파일 실행
RUN chmod +x /usr/local/bin/setup-sshd

# SSH 포트인 22번 포트 개방 (이후 Jenkins 연결에 사용)
EXPOSE 22

# 컨테이너가 실행되면 setup-sshd가 실행되도록 지정
ENTRYPOINT ["setup-sshd"]
 
 

Dockerfile 전체 코드

위의 내용들을 정리한 전체 코드는 다음과 같다.
더보기
필요에 맞게 수정하여 사용한다. 아래 MIT License는 반드시 포함해야 한다.
# The MIT License
#
#  Copyright (c) 2015, CloudBees, Inc.
#
#  Permission is hereby granted, free of charge, to any person obtaining a copy
#  of this software and associated documentation files (the "Software"), to deal
#  in the Software without restriction, including without limitation the rights
#  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#  copies of the Software, and to permit persons to whom the Software is
#  furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included in
#  all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#  THE SOFTWARE.

FROM abis.ahnlab.com/ubuntu:20.04

ARG user=jenkins
ARG group=jenkins
ARG uid=1000
ARG gid=1000
ARG JENKINS_AGENT_HOME=/home/${user}
ARG DEBIAN_FRONTEND=noninteractive

ENV JENKINS_AGENT_HOME ${JENKINS_AGENT_HOME}
ENV TZ=Asia/Seoul

RUN groupadd -g ${gid} ${group} \
    && useradd -d "${JENKINS_AGENT_HOME}" -u "${uid}" -g "${gid}" -m -s /bin/bash "${user}"

## 에이전트의 apt 설정파일을 복사한다.
# ./data/apt_conf/etc/apt/sources.list /etc/apt/
COPY ./data/apt_conf /

## sbt 설치 파일을 복사한다.
# COPY ./data/sbt_install/home/jenkins/sbt-1.9.0.deb /
COPY ./data/sbt_install /

## 필요한 apt package 목록들을 install한다.
RUN apt-get clean && apt-get autoremove && apt-get update \
    # setup SSH server
    && apt-get install --no-install-recommends -y openssh-server \
    && apt-get install apt-utils sudo build-essential locales vim openjdk-8-jdk curl git -y \
    && rm -rf /var/lib/apt/lists/* \
    && rm /etc/localtime \
    && ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime \
    # sbt 설치
    && dpkg -i ${JENKINS_AGENT_HOME}/sbt-1.9.0.deb \
    && rm ${JENKINS_AGENT_HOME}/sbt-1.9.0.deb

RUN adduser ${user} sudo \
    && echo "%sudo ALL=(ALL) NOPASSWD:ALL" >> /etc/sudeoers \
    && chmod a+rwx ${JENKINS_AGENT_HOME}

## 에이전트의 sbt 설정파일을 복사한다.
# COPY ./data/sbt_conf/etc/sbt/sbtopts /etc/sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/credentials /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/credentials.sbt /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/nexus-url /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/.sbt/repositories /home/jenkins/.sbt/
# COPY ./data/sbt_conf/home/jenkins/certs /home/jenkins/certs
# COPY ./data/sbt_conf/home/jenkins/.ssh /home/jenkins/.ssh
COPY ./data/sbt_conf/etc/sbt/sbtopts /etc/sbt/
COPY --chown=${user}:${group} ./data/sbt_conf/home/jenkins/ ${JENKINS_AGENT_HOME}/

ENV GIT_SSL_NO_VERIFY=0
ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
ENV PATH="${JAVA_HOME}/bin:${PATH}"
ENV SBT_OPTS="-Dsbt.override.build.repos=true"

## 자체서명 인증서 JVM에 등록
RUN keytool -importcert -trustcacerts -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit \
    -file ${JENKINS_AGENT_HOME}/certs/output.cert -alias 서버주소-1 -noprompt \
    && keytool -importcert -trustcacerts -keystore ${JAVA_HOME}/jre/lib/security/cacerts -storepass changeit \
    -file ${JENKINS_AGENT_HOME}/certs/rootca.crt -alias 서버주소 -noprompt \
    && rm -rf ${JENKINS_AGENT_HOME}/certs

## 자체서명 인증서를 사용한 경우 아래 옵션 추가
ENV SBT_OPTS="${SBT_OPTS} -Dmaven.wagon.https.ssl.insecure=true -Dmaven.wagon.https.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true -Djavax.net.ssl.trustStore=$JAVA_HOME/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit"

## ssh 설정 파일 소유자와 권한 설정
RUN chown ${user} ${JENKINS_AGENT_HOME} \
    && chown -R ${user} ${JENKINS_AGENT_HOME}/.ssh \
    && chmod 700 ${JENKINS_AGENT_HOME} \
    && chmod -R 700 ${JENKINS_AGENT_HOME}/.ssh

USER ${user}

RUN export http_proxy=http://프록시서버IP:포트 \
    && export https_proxy=http://프록시서버IP:포트 \
    && export no_proxy=*.bearpooh.com,192.168.*,172.*,10.*,localhost,[::1] \
    && /bin/bash -c "cd ~/test && sbt update && rm -rf ~/test" \
    && unset http_proxy && unset https_proxy && unset no_proxy

USER root

RUN sed -i /etc/ssh/sshd_config \
        -e 's/#PermitRootLogin.*/PermitRootLogin no/' \
        -e 's/#RSAAuthentication.*/RSAAuthentication yes/'  \
        -e 's/#PasswordAuthentication.*/PasswordAuthentication no/' \
        -e 's/#SyslogFacility.*/SyslogFacility AUTH/' \
        -e 's/#LogLevel.*/LogLevel INFO/' \
    && mkdir /var/run/sshd

VOLUME "${JENKINS_AGENT_HOME}" "/tmp" "/run" "/var/run"
WORKDIR "${JENKINS_AGENT_HOME}"

COPY setup-sshd /usr/local/bin/setup-sshd
ENV PATH /usr/local/bin:$PATH
RUN chmod +x /usr/local/bin/setup-sshd

EXPOSE 22

ENTRYPOINT ["setup-sshd"]
 
Jenkins에서 제공하는 Dockerfile 원본 코드는 아래를 참고한다.