{"id":312,"date":"2023-10-10T11:31:48","date_gmt":"2023-10-10T09:31:48","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/?page_id=312"},"modified":"2025-02-11T14:38:42","modified_gmt":"2025-02-11T12:38:42","slug":"2-11-integrar-dades-al-contenidor-docker","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/2-11-integrar-dades-al-contenidor-docker\/","title":{"rendered":"2.11. Integrar dades al contenidor Docker"},"content":{"rendered":"<p>Moltes vegades necessitarem utilitzar un <em>input <\/em>de manera sistem\u00e0tica en un contenidor. Per exemple, si volem fer una <em>variant call<\/em> utilitzant GATK, els genomes de refer\u00e8ncia sempre seran els mateixos i, tal vegada, \u00e9s interessant guardar-los dins del contenidor per assegurar-nos la reproductibilitat dels resultats per tal que no depengui de la refer\u00e8ncia utilitzada. Per a un cas m\u00e9s simple introduirem el nostre <em>script num.py<\/em> al contenidor. Per aix\u00f2 crearem una nova imatge modificant el Dockerfile.<\/p>\n<p>Hi afegirem una nova l\u00ednia:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">COPY num.py \/home<\/pre>\n<p>Estarem fent una c\u00f2pia de l\u2019<em>script <\/em>al <em>home<\/em> del contenidor. Fem una altra imatge:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image build -t uoc\/alpine-num .<\/pre>\n<p>Si ara entrem de forma interactiva dins del contenidor i llistem els arxius dins el <em>home,<\/em> trobarem l\u2019arxiu <em>num.py<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run --rm -it uoc\/alpine-num sh<\/pre>\n<p>\u00c9s important com ordenem les ordres al Dockerfile. \u00c9s recomanable fer les ordres COPY despr\u00e9s dels RUN, ja que, quan fem el <em>build<\/em>, Docker va per ordre i, si en algun moment volem afegir un altre <em>script<\/em> en lloc de <em>num.py<\/em>, si el COPY es troba al final del proc\u00e9s, Docker utilitzar\u00e0 els RUN que t\u00e9 a la mem\u00f2ria no haur\u00e0 de construir la imatge de zero, i el proc\u00e9s ser\u00e0 molt m\u00e9s r\u00e0pid. Docker va l\u00ednia a l\u00ednia i, si aquesta capa o conjunt de capes ja la t\u00e9 en mem\u00f2ria <em>cach\u00e9, <\/em>agilitza el proc\u00e9s perqu\u00e8 no ha de reinstal\u00b7lar-les.<\/p>\n<p>Si les dades que volem introduir en la nostra imatge s\u00f3n a internet, podem copiar-les directament fent servir RUN. Podr\u00edem afegir aquestes l\u00ednies al Dockerfile com a exemple:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">RUN wget https:\/\/ftp.ncbi.nlm.nih.gov\/refseq\/H_sapiens\/annotation\/GRCh38_latest\/refseq_identifiers\/GRCh38_latest_clinvar.vcf.gz<\/pre>\n<p>Per defecte, l\u2019arxiu es copia en el <em>root<\/em> del sistema del contenidor. Si el volgu\u00e9ssim moure a una altra localitzaci\u00f3, podr\u00edem especificar-la:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">RUN mv GRCh38_latest_clinvar.vcf.gz \/home<\/pre>\n<p>&#8230; i la copiaria a la nostra carpeta \/home.<\/p>\n<p>Ara que sabem com introduir l\u2019<em>script <\/em>dins del contenidor, podem crear un nou contenidor que corri <em>l\u2019script<\/em> autom\u00e0ticament. Hem de substituir CMD del Dockerfile a:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">CMD [\"python3\",\"\/home\/num.py\"]<\/pre>\n<p>D\u2019aquesta manera creem una nova imatge:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image build -t uoc\/alpine-numpy-ex .<\/pre>\n<p>&#8230; i executem directament:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run --rm uoc\/alpine-numpy-ex<\/pre>\n<p>&#8230; i ens retorna el resultat de l\u2019arxiu <em>num.py<\/em>.<\/p>\n<p>Si volem introduir un nou <em>script<\/em> de Python (<em>atcg.py<\/em>) on el seu resultat depengui d\u2019un argument:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">import sys\r\n\r\nfilename = sys.argv[1]\r\n\r\nfilenumb = len(filename)\r\n\r\nprint (filenumb)<\/pre>\n<p>&#8230; i el copiarem mitjan\u00e7ant Dockerfile:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">COPY atcg.py \/home<\/pre>\n<p>&#8230; i crearem una nova imatge:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker image build -t uoc\/alpine-atcg .<\/pre>\n<div>Si el fem c\u00f3rrer directament, tindrem el resultat del CMD (en el nostre cas, la versi\u00f3 de Python); mentre que, si afegim arguments a l&#8217;ordre <code>run<\/code>, se sobreescriu CMD i obtenim el resultat del nou <em>script<\/em>:<\/div>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run --rm uoc\/alpine-atcg python3 \/home\/atcg.py ATG<\/pre>\n<p>Si volgu\u00e9ssim tenir aquest nou <em>script<\/em> com ordres per defecte, al Dockerfile haur\u00edem de canviar la l\u00ednia de CMD pels valors per defecte i crear una nova l\u00ednia anomenada ENTRYPOINT per localitzar l\u2019<em>script<\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">ENTRYPOINT [\"python3\",\"atcg.py\"]\r\n\r\nCMD [\"ACTG\"]<\/pre>\n<p>Tamb\u00e9 podem afegir abans de ENTRYPOINT i CMD una entrada per definir el directori de treball:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">WORKDIR \/home<\/pre>\n<p>D\u2019aquesta manera, si creem una nova imatge <code>uoc\/alpine-entry<\/code> i executem el contenidor directament:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run\u00a0 --rm uoc\/alpine-entry<\/pre>\n<p>Ens retornar\u00e0 \u00ab4\u00bb, la longitud de la l\u00ednia \u00abACTG\u00bb ubicada per defecte al Dockerfile. Si ara, al final de l\u2019ordre <em>run,<\/em> hi afegim un altre <em>input<\/em>, aquest substituir\u00e0 el de CMD:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ docker container run\u00a0 --rm uoc\/alpine-entry Genetica<\/pre>\n<p>Retornar\u00e0 \u00ab8\u00bb.<\/p>\n<p>Podem observar la relaci\u00f3 entre ENTRYPOINT i CMD en la seg\u00fcent taula.<\/p>\n<div class=\"tabletitle\"><p>Taula 5.<\/p>\n<\/div>\n<table width=\"642\">\n<tbody>\n<tr>\n<td width=\"160\"><\/td>\n<td width=\"161\"><strong>No ENTRYPOINT<\/strong><\/td>\n<td width=\"161\"><strong>ENTRYPOINT<\/strong> exec_entry p1_entry<\/td>\n<td width=\"160\"><strong>ENTRYPOINT<\/strong> [&#8220;exec_entry&#8221;, &#8220;p1_entry&#8221;]<\/td>\n<\/tr>\n<tr>\n<td width=\"160\"><strong>No CMD<\/strong><\/td>\n<td width=\"161\">error, not allowed<\/td>\n<td width=\"161\">\/bin\/sh -c exec_entry p1_entry<\/td>\n<td width=\"160\">exec_entry p1_entry<\/td>\n<\/tr>\n<tr>\n<td width=\"160\"><strong>CMD<\/strong> [&#8220;exec_cmd&#8221;, &#8220;p1_cmd&#8221;]<\/td>\n<td width=\"161\">exec_cmd p1_cmd<\/td>\n<td width=\"161\">\/bin\/sh -c exec_entry p1_entry<\/td>\n<td width=\"160\">exec_entry p1_entry exec_cmd p1_cmd<\/td>\n<\/tr>\n<tr>\n<td width=\"160\"><strong>CMD<\/strong> exec_cmd p1_cmd<\/td>\n<td width=\"161\">\/bin\/sh -c exec_cmd p1_cmd<\/td>\n<td width=\"161\">\/bin\/sh -c exec_entry p1_entry<\/td>\n<td width=\"160\">exec_entry p1_entry \/bin\/sh -c exec_cmd p1_cmd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Font: elaboraci\u00f3 pr\u00f2pia.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Moltes vegades necessitarem utilitzar un input de manera sistem\u00e0tica en un contenidor. Per exemple, si volem fer una variant call utilitzant GATK, els genomes de refer\u00e8ncia sempre seran els mateixos i, tal vegada, \u00e9s interessant guardar-los dins del contenidor per assegurar-nos la reproductibilitat dels resultats per tal que no depengui de la refer\u00e8ncia utilitzada. Per [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages\/312"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/comments?post=312"}],"version-history":[{"count":7,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages\/312\/revisions"}],"predecessor-version":[{"id":455,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/pages\/312\/revisions\/455"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/entornos-y-contenedores\/wp-json\/wp\/v2\/media?parent=312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}