为什么docker-compose命令在docker运行命令成功时失败?

我有以下docker-compose.yml

 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 

编辑:和下面的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 

如果我运行docker-compose up carton exec ...命令失败:

 $ 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 ... 

但是,如果我在容器上手动运行相同的命令,则会成功:

 $ 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/ 

任何两个命令之间有什么不同的想法?

对于参考纸盒就像Bundler for Perl。 使用carton exec应该设置Perl环境,以便包含适当的库path,其中包含所有应用程序特定的依赖关系 – 与docker run命令一起使用。

我们可以看到正在构build的Dockerfile吗? (我缺乏在评论中要求的声望。 编辑:谢谢!

(编辑:)

我注意到的一个区别是,你正在安装./code docker-compose文件中/code ,但不是在手动运行命令时。 我对Carton并不熟悉,但是如果在Dockerfile中执行carton install时在/code内部创build工件,那么由于docker-compose volumes定义,可能会丢失它们。