16435: Updates the documentation.
[arvados.git] / doc / user / topics / arv-docker.html.textile.liquid
1 ---
2 layout: default
3 navsection: userguide
4 title: "Customizing Crunch environment using Docker"
5 ...
6 {% comment %}
7 Copyright (C) The Arvados Authors. All rights reserved.
8
9 SPDX-License-Identifier: CC-BY-SA-3.0
10 {% endcomment %}
11
12 This page describes how to customize the runtime environment (e.g., the programs, libraries, and other dependencies needed to run a job) that a crunch script will be run in using "Docker.":https://www.docker.com/  Docker is a tool for building and running containers that isolate applications from other applications running on the same node.  For detailed information about Docker, see the "Docker User Guide.":https://docs.docker.com/userguide/
13
14 This page will demonstrate how to:
15
16 # Fetch the arvados/jobs Docker image
17 # Manually install additional software into the container
18 # Create a new custom image
19 # Upload that image to Arvados for use by Crunch jobs
20 # Share your image with others
21
22 {% include 'tutorial_expectations_workstation' %}
23
24 You also need ensure that "Docker is installed,":https://docs.docker.com/installation/ the Docker daemon is running, and you have permission to access Docker.  You can test this by running @docker version@.  If you receive a permission denied error, your user account may need to be added to the @docker@ group.  If you have root access, you can add yourself to the @docker@ group using @$ sudo addgroup $USER docker@ then log out and log back in again; otherwise consult your local sysadmin.
25
26 h2. Fetch a starting image
27
28 The easiest way to begin is to start from the "arvados/jobs" image which already has the Arvados SDK installed along with other configuration required for use with Crunch.
29
30 Download the latest "arvados/jobs" image from the Docker registry:
31
32 <notextile>
33 <pre><code>$ <span class="userinput">docker pull arvados/jobs:latest</span>
34 Pulling repository arvados/jobs
35 3132168f2acb: Download complete
36 a42b7f2c59b6: Download complete
37 e5afdf26a7ae: Download complete
38 5cae48636278: Download complete
39 7a4f91b70558: Download complete
40 a04a275c1fd6: Download complete
41 c433ff206a22: Download complete
42 b2e539b45f96: Download complete
43 073b2581c6be: Download complete
44 593915af19dc: Download complete
45 32260b35005e: Download complete
46 6e5b860c1cde: Download complete
47 95f0bfb43d4d: Download complete
48 c7fd77eedb96: Download complete
49 0d7685aafd00: Download complete
50 </code></pre>
51 </notextile>
52
53 h2. Install new packages
54
55 Next, enter the container using @docker run@, providing the arvados/jobs image and the program you want to run (in this case the bash shell).
56
57 <notextile>
58 <pre><code>$ <span class="userinput">docker run --interactive --tty --user root arvados/jobs /bin/bash</span>
59 root@fbf1d0f529d5:/#
60 </code></pre>
61 </notextile>
62
63 Next, update the package list using @apt-get update@.
64
65 <notextile>
66 <pre><code>root@fbf1d0f529d5:/# apt-get update
67 Get:2 http://apt.arvados.org stretch-dev InRelease [3260 B]
68 Get:1 http://security-cdn.debian.org/debian-security stretch/updates InRelease [94.3 kB]
69 Ign:3 http://cdn-fastly.deb.debian.org/debian stretch InRelease
70 Get:4 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
71 Get:5 http://apt.arvados.org stretch-dev/main amd64 Packages [208 kB]
72 Get:6 http://cdn-fastly.deb.debian.org/debian stretch Release [118 kB]
73 Get:7 http://security-cdn.debian.org/debian-security stretch/updates/main amd64 Packages [499 kB]
74 Get:8 http://cdn-fastly.deb.debian.org/debian stretch Release.gpg [2434 B]
75 Get:9 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages.diff/Index [10.6 kB]
76 Get:10 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages 2019-07-08-0821.07.pdiff [445 B]
77 Get:10 http://cdn-fastly.deb.debian.org/debian stretch-updates/main amd64 Packages 2019-07-08-0821.07.pdiff [445 B]
78 Fetched 1026 kB in 0s (1384 kB/s)
79 Reading package lists... Done
80 </code></pre>
81 </notextile>
82
83 In this example, we will install the "R" statistical language Debian package "r-base-core".  Use @apt-get install@:
84
85 <notextile>
86 <pre><code>root@fbf1d0f529d5:/# <span class="userinput">apt-get install r-base-core</span>
87 Reading package lists... Done
88 Building dependency tree
89 Reading state information... Done
90 The following additional packages will be installed:
91 [...]
92 done.
93 </code></pre>
94 </notextile>
95
96 Now we can verify that "R" is installed:
97
98 <notextile>
99 <pre><code>root@fbf1d0f529d5:/# <span class="userinput">R</span>
100
101 R version 3.3.3 (2017-03-06) -- "Another Canoe"
102 Copyright (C) 2017 The R Foundation for Statistical Computing
103 Platform: x86_64-pc-linux-gnu (64-bit)
104
105 R is free software and comes with ABSOLUTELY NO WARRANTY.
106 You are welcome to redistribute it under certain conditions.
107 Type 'license()' or 'licence()' for distribution details.
108
109 R is a collaborative project with many contributors.
110 Type 'contributors()' for more information and
111 'citation()' on how to cite R or R packages in publications.
112
113 Type 'demo()' for some demos, 'help()' for on-line help, or
114 'help.start()' for an HTML browser interface to help.
115 Type 'q()' to quit R.
116
117 >
118 </code></pre>
119 </notextile>
120
121 Note that you are not limited to installing Debian packages.  You may compile programs or libraries from source and install them, edit systemwide configuration files, use other package managers such as @pip@ or @gem@, and perform any other customization necessary to run your program.
122
123 h2. Create a new image
124
125 We're now ready to create a new Docker image.  First, quit the container, then use @docker commit@ to create a new image from the stopped container.  The container id can be found in the default hostname of the container displayed in the prompt, in this case @fbf1d0f529d5@:
126
127 <notextile>
128 <pre><code>root@fbf1d0f529d5:/# <span class="userinput">exit</span>
129 $ <span class="userinput">docker commit fbf1d0f529d5 arvados/jobs-with-r</span>
130 sha256:2818853ff9f9af5d7f77979803baac9c4710790ad2b84c1a754b02728fdff205
131 $ <span class="userinput">docker images</span>
132 $ docker images |head
133 REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
134 arvados/jobs-with-r   latest              2818853ff9f9        9 seconds ago       703.1 MB
135 arvados/jobs          latest              12b9f859d48c        4 days ago          362 MB
136 </code></pre>
137 </notextile>
138
139 h2. Upload your image
140
141 Finally, we are ready to upload the new Docker image to Arvados.  Use @arv-keepdocker@ with the image repository name to upload the image.  Without arguments, @arv-keepdocker@ will print out the list of Docker images in Arvados that are available to you.
142
143 <notextile>
144 <pre><code>$ <span class="userinput">arv-keepdocker arvados/jobs-with-r</span>
145 703M / 703M 100.0%
146 Collection saved as 'Docker image arvados/jobs-with-r:latest 2818853ff9f9'
147 qr1hi-4zz18-abcdefghijklmno
148 $ <span class="userinput">arv-keepdocker</span>
149 REPOSITORY                      TAG         IMAGE ID      COLLECTION                     CREATED
150 arvados/jobs-with-r             latest      2818853ff9f9  qr1hi-4zz18-abcdefghijklmno    Tue Jan 17 20:35:53 2017
151 </code></pre>
152 </notextile>
153
154 You are now able to specify the runtime environment for your program using @DockerRequirement@ in your workflow:
155
156 <pre>
157 hints:
158   DockerRequirement:
159     dockerPull: arvados/jobs-with-r
160 </pre>
161
162 h2. Share Docker images
163
164 Docker images are subject to normal Arvados permissions.  If wish to share your Docker image with others (or wish to share a pipeline template that uses your Docker image) you will need to use @arv-keepdocker@ with the @--project-uuid@ option to upload the image to a shared project.
165
166 <notextile>
167 <pre><code>$ <span class="userinput">arv-keepdocker arvados/jobs-with-r --project-uuid qr1hi-j7d0g-xxxxxxxxxxxxxxx</span>
168 </code></pre>
169 </notextile>