2015-09-06 40 views
-1

我有这样的搬运工,撰写:码头工人,组成不运行命令

web: 
    build: ../../ 
    dockerfile: environments/production/Dockerfile 
    links: 
     - fpm:fpm 
     - redis:redis 
     - elasticsearch:elasticsearch 
     - beanstalkd:beanstalkd 
    volumes: 
     - /var/cache/nginx 
     - ../../:/app:ro 
... 
composer: 
    image: imega/composer 
    volumes: 
    - ../../:/data 
    command: ["install"] 
node: 
    image: node:slim 
    volumes: 
    - ../../:/app 
    working_dir: /app 
    entrypoint: npm 
    command: ["install"] 

我们的目标是在建造安装作曲家和节点DEPS。它应该在理论上工作,但实际上在容器定义中编写的命令不会执行。任何命令。我试图在那里运行'echo',或'ls'。 - 没有。

任何想法为什么?

回答

1

我想你误会这里有两件事情:

  • 您正在运行npm install在体积安装依赖关系,然后卷是由您的应用程序容器消耗。这不包含应用程序映像中的任何依赖项。虽然这可能起作用,但这意味着图像并非真正运行。当您将此映像发布到生产环境时,您打算签署一份说明“此应用程序与开发版本相同”的合同。注意这一点。
  • 您正在运行npm install作为最终将退出的服务。当命令退出时,容器停止。更重要的是,web服务(可能取决于这些依赖关系)可能在npm install完成之前开始。

难道你不想让composer installnpm install作为应用程序构建过程的一部分吗?

+0

音量设置为主机目录,这是理念 - 服务与主机直接相互作用,直接向主机安装依赖关系。这就是这个容器如何设计使用:https://hub.docker.com/r/imega/composer/ 问题不在某些服务中,但是传递给“command”的ANY命令不起作用。我在那里写'ls'。或'回声嗨' - 没有输出。 »»是否有一个原因,你不想让作曲家安装和npm安装作为你的应用程序构建过程的一部分? - 事实上,我正试图为自动部署获得最佳的工作流程。你认为有更好的方法? – Terion

+0

早些时候,我已经尝试了一种方法,当应用程序在主容器(网络)中生成并测试时,这一切都是在dockerfile中编写的。这是行得通的,但现在我试图让事情变得更加干燥,更单一的责任,因为它应该在码头工人。我甚至从fpm中分离出了nginx。考虑到这一点,我正在尝试重新设计工作流程。 – Terion

0

不使用命令:“安装”]

尝试:

命令:安装

+0

nothing changes =( – Terion