2016-03-28 14 views
6

Mam następujący docker-compose.yml:Dlaczego ta komenda tworzenia dokowanego kończy się niepowodzeniem, gdy polecenie uruchamiania dokowanego działa poprawnie?

db: 
    image: postgres 
search: 
    image: elasticsearch 
web: 
    build: . 
    working_dir: /code 
    environment: 
     CATALYST_CONFIG_LOCAL_SUFFIX: development 
    volumes: 
     - .:/code 
    ports: 
     - "8000:8000" 
    links: 
     - db 
     - search 
    command: carton exec plackup -E development bicycleevents_web.psgi -p 8000 

Edit: a następnego Dockerfile:

FROM ubuntu:latest 

RUN apt-get update 
RUN apt-get install -y --force-yes build-essential curl libssl-dev postgresql-client libpq-dev perl-doc 
RUN apt-get clean 

RUN curl -L https://cpanmin.us | perl - --sudo App::cpanminus 
RUN cpanm Carton 
RUN mkdir /code 
WORKDIR /code 
ADD . /code/ 
RUN rm -rf /code/local/ 
RUN carton install 

Jeśli biegnę docker-compose up komenda carton exec ... zawiedzie:

$ docker-compose up 
... 
Starting bicycleeventsweb_web_1 
web_1 | Error while loading /code/bicycleevents_web.psgi: Can't locate Moose.pm in @INC (you may need to install the Moose module) (@INC contains: /code/lib /code/local/lib/perl5 /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at /code/lib/BicycleEvents/Web.pm line 2. 
web_1 | BEGIN failed--compilation aborted at /code/lib/BicycleEvents/Web.pm line 2. 
web_1 | Compilation failed in require at /code/bicycleevents_web.psgi line 6. 
web_1 | BEGIN failed--compilation aborted at /code/bicycleevents_web.psgi line 6. 
bicycleeventsweb_web_1 exited with code 2 
... 

Jednakże, jeśli biegnę to samo polecenie ręcznie na kontenerze, to się uda:

$ docker run -i -t -e "CATALYST_CONFIG_LOCAL_SUFFIX=development" bicycleeventsweb_web carton exec plackup -E development bicycleevents_web.psgi -p 8000 
... 
HTTP::Server::PSGI: Accepting connections at http://0:8000/ 

Jakieś przemyślenia na temat tego, co różni się między tymi dwoma poleceniami?

Dla odniesienia carton jest jak Bundler dla Perla. Przy użyciu carton exec należy skonfigurować środowisko Perla tak, aby zawierały odpowiednie ścieżki biblioteki, które zawierają wszystkie zależne od aplikacji zależności - tak jak działa z poleceniem docker run.

Odpowiedz

2

Czy możemy zobaczyć plik Docker, który jest tworzony? (Brak mi reputację zapytać w komentarzu Edycja:.! Dzięki)

(Edit :)

Jedną różnicą Zauważyłem, że jesteś do montażu ./code w swojej Döcker-Compose plik, ale nie robisz tego ręcznie. Nie jestem zaznajomiony z kartonem, ale jeśli tworzy on artefakty wewnątrz /code podczas wykonywania carton install w pliku Dockerfile, możesz stracić je w wyniku definicji twojej doker-compose volumes.

+0

Oczywiście, dodałem również plik Dockerfile. Pojemnik internetowy został już zbudowany w tym punkcie. –

+0

Czy możesz rozwinąć znaczenie definicji woluminów? Artefakty biblioteki są instalowane w katalogu kodu, więc brzmi to jak właściwy obszar. –

+0

Okay, skomentowałem definicję 'volume' i teraz to się zaczyna. Myślę, że skopiowałem to z przykładu Django lub Rails, muszę sprawdzić, co robi, ale jestem o krok dalej! Fakt, że przeglądam moją aplikację w przeglądarce, będzie kolejnym wyzwaniem. Dzięki. –