Tem problemas para descobrir o contexto de execução usando o Docker e o Docker Compose

1

Eu tenho o seguinte docker-compose.yml:

version: '3'
services:
  frontend:
    build: 
      context: ./
      dockerfile: docker/Dockerfile
    image: tsl.web.frontend.image
    container_name: tsl.web.frontend.container
    ports:
      - "8080:80"

Observe o context: ./

E este é o meu comando docker-compose:

docker-compose build --force-rm --build-arg ENVIRONMENT=development frontend

Aqui está a estrutura do meu código src:

Reparequeovermelhodestacoudoisaspectosimportantesdessaestrutura.

AgoraaquiéumapartedomeuDockerfile,vouincluirtodooDockerfileabaixo:

#https://stackoverflow.com/a/35774741/1258525#usechangestopackage.jsontoforceDockernottousethecache#whenwechangeourapplication'snodejsdependencies:COPY./package.json/tmp/package.jsonRUNnpm--prefix/tmpinstall/tmpRUNcp-rn/tmp/node_modules./#RUNnpm--prefix./runbuild-development./RUNnpmrunbuild-development#failinghereCOPYdist/usr/share/nginx/html

Portanto,ocomandoRUNnpmrunbuild-developmentestáfalhandoporquenãopodeencontraropackage.json:

ÉaquiqueestouconfusosobreocontextodeexecuçãodainstruçãoRUN.Conseguicopiaroarquivopackage.jsonpara/tmpnocomandoanteriordoDockerfileCOPY./package.json/tmp/package.json.Euachoquemeucontextoaindaéondemeuarquivodocker-compose.ymlmora,masobviamentenãoé...

Dockerfilecompleto:

FROMcentos:7MAINTAINERBrianOgden#NotcurrentlybeingusedbutmaycomeinhandyARGENVIRONMENTENVNODE_VERSION6.11.1RUNyum-yupdate;yumcleanallRUNyum-yinstallhttp://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm;yum-ymakecacheRUNyum-yinstallnginx-1.12.0#CleanupsomedefaultNGINXconfigurationfileswedon’tneedRUNrm/etc/nginx/conf.d/default.confCOPY./docker/conf/frontend.conf/etc/nginx/conf.d/frontend.confCOPY./docker/conf/nginx.conf/etc/nginx/nginx.conf##############################################NodeJsInstall#############################################RUNyuminstall-y\wget#DownloadNodeJspackageRUNwgethttps://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz#extractthebinarypackageintooursystem'slocalpackagehierarchywiththetarcommand.#Thearchiveispackagedwithinaversioneddirectory,whichwecangetridofbypassingthe--strip-components1option.#Wewillspecifythetargetdirectoryofourcommandwiththe-Ccommand:#Thiswillinstallallofthecomponentswithinthe/usr/localbranchRUNtar--strip-components1-xzvfnode-v*-C/usr/local##############################################https://stackoverflow.com/a/35774741/1258525#usechangestopackage.jsontoforceDockernottousethecache#whenwechangeourapplication'snodejsdependencies:COPY./package.json/tmp/package.jsonRUNnpm--prefix/tmpinstall/tmpRUNcp-rn/tmp/node_modules./#RUNnpm--prefix./runbuild-development./RUNnpmrunbuild-developmentCOPYdist/usr/share/nginx/htmlEXPOSE8080CMD["nginx"]
    
por Brian 19.12.2017 / 21:10

2 respostas

1

Você pode executar o container intermediário com o id 4e14504665eb e explorar o sistema de arquivos.

$ docker run -it --rm 4e14504665eb  bash

ou você pode executar diretamente

$ docker run -it --rm 4e14504665eb  ls -la /tmp

Mas esses comandos parecem um pouco estranhos

RUN npm --prefix /tmp install /tmp
RUN cp -rn /tmp/node_modules ./
RUN npm run build-development

Você provavelmente deve executar o comando build no diretório / tmp

P.S. Seu Dockerfile não parece ótimo. Sugiro usar mais versão otimizada

    
por 20.12.2017 / 00:18
0

Acredito que a base do meu mal-entendido foi realmente o contexto de execução do comando Docker COPY versus o comando RUN .

Achei que o comando RUN estava em execução no mesmo contexto de execução que COPY , que seria o Dockerfile ou o contexto declarado em my docker-compose.yml, porque COPY estava neste contexto.

Esse não é o caso, basicamente, COPY know ./ para o Dockerfile. RUN , no entanto, não sabe sobre nada fora da imagem do Docker que está sendo construída.

Eu estava tentando RUN um comando contra arquivos que eu não havia copiado na imagem do Docker que estava criando. Esta seção do meu Dockerfile foi o segredo para o sucesso:

WORKDIR /app
COPY . /app

RUN npm run build-$ENVIRONMENT

E aqui está o meu Dockerfile completo, graças ao ALex_hha para algumas das otimizações de sintaxe:

FROM centos:7
MAINTAINER Brian Ogden

# Not currently being used but may come in handy
ARG ENVIRONMENT
ENV NODE_VERSION 6.11.1

RUN yum -y update && \
    yum clean all && \
    yum -y install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm \
    yum -y makecache && \
    yum -y install nginx-1.12.0 wget

# Cleanup some default NGINX configuration files we don’t need
RUN rm /etc/nginx/conf.d/default.conf

#############################################
# NodeJs Install
#############################################

#Download NodeJs package
RUN wget -q -O - https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz \
    | tar --strip-components=1 -xzf - -C /usr/local
#pipe tar is extracting the binary package into our system's local package hierarchy with the tar command. 
#The archive is packaged within a versioned directory, which we can get rid of by passing the --strip-components 1 option. 
#We will specify the target directory of our command with the -C command:
#This will install all of the components within the /usr/local branch

# https://stackoverflow.com/a/35774741/1258525
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY ./package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir /app && cp -a /tmp/node_modules /app/

WORKDIR /app
COPY . /app

RUN npm run build-$ENVIRONMENT

RUN cd /app && cp -a dist/* /usr/share/nginx/html
COPY ./docker/conf/frontend.conf /etc/nginx/conf.d/frontend.conf
COPY ./docker/conf/nginx.conf /etc/nginx/nginx.conf


EXPOSE 80

CMD ["nginx"]
    
por 20.12.2017 / 23:14