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してきたイメージを指定して、RUN
でAWS 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してきたファイルが指定のディレクトリに置けていないみたいです。
試しにpwd
とls
を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で置いてやってみるところからやってみようと思います。