yyp٩( 'ω' )و

色々触って遊んでます

docker上で動くJenkinsでAWS CLIを使いたい(前編)

まえがき

dockerで動くJenkinsを構築し、そのジョブでAWS CLIを使う用事があったのですがなかなかできないので記事にしながら整理します…!
長くなってしまったので前編後編で分けます。

環境

  • OS: macOS Mojave
  • OS version: 10.14.6
  • docker version: 19.03.1

Jenkins構築

dockerhubから公式のJenkinsイメージをpullします。

% docker pull jenkins  

イメージがpullできたことを確認します。

% docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jenkins             latest              cd14cecfdb3a        13 months ago       696MB

一度このイメージからコンテナを起動します。

% docker run -d -p 8080:8080 -it --name jenkins jenkins
% docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
0a3ccda1f28c        jenkins             "/bin/tini -- /usr/l…"   25 seconds ago      Up 23 seconds       0.0.0.0:8080->8080/tcp, 50000/tcp   jenkins

ブラウザでlocalhost:8080にアクセスすると、Jenkinsの初期設定画面が表示されます。
ここまでで一旦置いておきます。

AWS CLIを実行できるようにする

AWS CLIをインストールするためにDockerfileを作ります。
FROMで先ほどpullしてきたイメージを指定して、RUNAWS CLIのインストールをします。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
RUN unzip awscli-bundle.zip
RUN ./awscli-bundle/install -b ~/bin/aws

docker buildでイメージを作ります。イメージ名はjenkins-awscliとします。

% docker build -t jenkins-awscli:latest . --rm=true
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
 ---> Running in 19158b3354aa
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Warning: Failed to create the file awscli-bundle.zip: Permission denied
  0 11.9M    0 16360    0     0  12166      0  0:17:09  0:00:01  0:17:08 12172
curl: (23) Failed writing body (0 != 16360)
The command '/bin/sh -c curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"' returned a non-zero code: 23

ファイルを作る権限がないようです…
先ほど立てたjenkinsコンテナに入ってみると、最初のカレントディレクトリが/なので、これが原因かな…?
jenkinsユーザのホームディレクトリを指定してやってみます。
Dockerfileを下記のように修正します。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
RUN unzip /var/jenkins_home/awscli-bundle.zip
RUN ./awscli-bundle/install -b ~/bin/aws

もう一度イメージを作ります。

% docker build -t jenkins-awscli:latest . --rm=true
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
 ---> Running in 18351a0165be
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.9M  100 11.9M    0     0   870k      0  0:00:14  0:00:14 --:--:--  978k
Removing intermediate container 18351a0165be
 ---> 0f58bb1e22df
Step 3/4 : RUN unzip /var/jenkins_home/awscli-bundle.zip
 ---> Running in 859faaa07f33
unzip:  cannot find or open /var/jenkins_home/awscli-bundle.zip, /var/jenkins_home/awscli-bundle.zip.zip or /var/jenkins_home/awscli-bundle.zip.ZIP.
The command '/bin/sh -c unzip /var/jenkins_home/awscli-bundle.zip' returned a non-zero code: 9

どうもcurlしてきたファイルが指定のディレクトリに置けていないみたいです。
試しにpwdlsをRUNで実行してみます。

FROM jenkins:latest
RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
RUN pwd
RUN ls -al /var/jenkins_home/
#RUN unzip /var/jenkins_home/awscli-bundle.zip
#RUN ./awscli-bundle/install -b ~/bin/aw

ビルドします。

docker build -t jenkins-awscli:latest . --no-cache
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/4 : RUN curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "/var/jenkins_home/awscli-bundle.zip"
 ---> Running in 036df9da7fcb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11.9M  100 11.9M    0     0  1416k      0  0:00:08  0:00:08 --:--:-- 1822k
Removing intermediate container 036df9da7fcb
 ---> fe9b3bb14ff9
Step 3/4 : RUN pwd
 ---> Running in 5d77ba51659a
/
Removing intermediate container 5d77ba51659a
 ---> 1ac650f90bf7
Step 4/4 : RUN ls -al /var/jenkins_home/
 ---> Running in f4fb7e4bcc50
total 20
drwxr-xr-x 2 jenkins jenkins 4096 Aug 28 13:21 .
drwxr-xr-x 1 root    root    4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins  220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins 3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins  675 May 15  2017 .profile
Removing intermediate container f4fb7e4bcc50
 ---> 46ad3e98188b
Successfully built 46ad3e98188b
Successfully tagged jenkins-awscli:latest

カレントディレクトリは/で、/var/jenkins_home/にはやはりファイルが置かれていないようです…
curlの-o以降が認識されていないのでは?」と指摘をもらったので、ローカルでzipファイルをcurlして、COPYで置くことにしてみます。

FROM jenkins:latest
COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
RUN ls -al /var/jenkins_home/
#RUN unzip /var/jenkins_home/awscli-bundle.zip
#RUN ./awscli-bundle/install -b ~/bin/aws

ビルドしてみると、zipファイルが置けています。

% docker build -t jenkins-awscli:latest . --no-cache
Sending build context to Docker daemon  12.52MB
Step 1/3 : FROM jenkins:latest
 ---> cd14cecfdb3a
Step 2/3 : COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
 ---> 9b0dccab7709
Step 3/3 : RUN ls -al /var/jenkins_home/
 ---> Running in 8233fb5290c3
total 12252
drwxr-xr-x 2 jenkins jenkins     4096 Aug 28 13:30 .
drwxr-xr-x 1 root    root        4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins      220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins     3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins      675 May 15  2017 .profile
-rw-r--r-- 1 root    root    12521907 Aug 28 13:27 awscli-bundle.zip
Removing intermediate container 8233fb5290c3
 ---> 82c3c1da2556
Successfully built 82c3c1da2556
Successfully tagged jenkins-awscli:latest

unzipのコメントアウトを外してイメージを作り直してみます。
解凍先も指定しました。

FROM jenkins:latest
COPY awscli-bundle.zip /var/jenkins_home/awscli-bundle.zip
RUN unzip /var/jenkins_home/awscli-bundle.zip -d /var/jenkins_home/
# lsでファイルがあることを確認
RUN ls -al /var/jenkins_home/
#RUN ./awscli-bundle/install -b ~/bin/aws

ビルド〜

~~~  
Archive:  /var/jenkins_home/awscli-bundle.zip
  inflating: /var/jenkins_home/awscli-bundle/install
  inflating: /var/jenkins_home/awscli-bundle/packages/virtualenv-15.1.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/argparse-1.2.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/urllib3-1.25.3.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/colorama-0.3.9.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/PyYAML-5.1.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/rsa-3.4.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/docutils-0.15.2.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/s3transfer-0.2.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/python-dateutil-2.8.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/awscli-1.16.227.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/ordereddict-1.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/python-dateutil-2.6.1.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/jmespath-0.9.4.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/botocore-1.12.217.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/pyasn1-0.4.6.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/urllib3-1.22.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/six-1.12.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/futures-3.3.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/simplejson-3.3.0.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/PyYAML-3.13.tar.gz
  inflating: /var/jenkins_home/awscli-bundle/packages/setup/setuptools_scm-1.15.7.tar.gz
Removing intermediate container 6b1fea1c92b8
 ---> 82230c66e941
Step 4/4 : RUN ls -al /var/jenkins_home/
 ---> Running in 552c780855a0
total 12252
drwxr-xr-x 2 jenkins jenkins     4096 Aug 28 13:36 .
drwxr-xr-x 1 root    root        4096 Jul 17  2018 ..
-rw-r--r-- 1 jenkins jenkins      220 May 15  2017 .bash_logout
-rw-r--r-- 1 jenkins jenkins     3526 May 15  2017 .bashrc
-rw-r--r-- 1 jenkins jenkins      675 May 15  2017 .profile
-rw-r--r-- 1 root    root    12521907 Aug 28 13:27 awscli-bundle.zip
~~~

…?
解凍できてるっぽいのに解凍したものがディレクトリにありません。
コンテナを立ち上げてsshして手動でunzipしてみたのですがこれは普通にできました。

まとめ

直面した問題をまとめておきます。

  • Dockerfile内でのcurlはオプションが使えない?
    => ローカルに落としてきたzipをCOPYで置くことで暫定対応。どうしてcurlでファイルを配置できないのかは謎のまま。

  • Dockerfile内でのunzipができてる風なのにできていない?
    => コンテナに入って手動でのunzipはできるので謎。解凍済みのディレクトリを丸ごとコピーしてみようかと思う。

次は解凍済みのディレクトリをCOPYで置いてやってみるところからやってみようと思います。