在docker-compose构建期间运行npm install时出现问题

时间:2017-03-10 22:12:24

标签: docker docker-compose dockerfile

我有一个docker镜像,可以安装ubuntu和RUN一些额外的命令,比如安装NodeJS。

Dockerfile(与docker-compose.yml结合使用)还会将目录安装到主机上的目录中。看起来像这样:

services:
  test:
    build:
      context: ../../
      dockerfile: docker/Dev/Dockerfile
    ports:
      - 7000:7000
    volumes:
      - ./../../src:/src

Dockerfile我有一个卷的以下行:

VOLUME ["/src"]
WORKDIR /src

当我使用docker-compose up运行容器,然后在容器的已安装ls -a文件夹中执行src/时,我会看到我在主机上看到的所有文件。到目前为止一切都很好。

(命令我也在容器中查看:docker exec -it <container hash> ls -a

由于所有文件都在那里,包括package.json,我在我的RUN添加了一个新的Dockerfile命令:npm install。所以我有这个:

VOLUME ["/src"]
WORKDIR /src
RUN npm install

除了给我一个错误,它在package.json文件夹中找不到src/

当我添加RUN ls -a时(请记住,我切换到带有src/的{​​{1}}文件夹),然后它显示它是一个空目录......

所以在WORKDIR我有:

Dockerfile

但是,在我执行VOLUME ["/src"] WORKDIR /src # shows that /src is empty. If I do 'RUN pwd', then it shows I really am in /src RUN ls -a RUN npm install 然后再次在容器的docker-compose up文件夹中执行ls -a后,它会再次显示我的所有源文件。

所以我的问题是,为什么他们不在构建期间(我正在运行/src)?

解决此问题的方法是什么?

1 个答案:

答案 0 :(得分:3)

您误解了Dockerfile中的VOLUME命令与-v守护程序的docker标志之间的区别(docker-compose用于其卷的内容)。< / p>

volumes文件中docker-compose项下的值告诉docker在图像构建完成后,中要映射的目录。在构建过程中不使用它们。

幸运的是,由于撰写文件中的context行,您可以自动访问所有源文件 - 它们只位于本地src目录中,而不是您当前的工作目录!

尝试将Dockerfile更新为以下内容:

# NOTE: You don't want a VOLUME directive if you only want to mount a local
# directory. WORKDIR is optional, but doesn't matter for my example,
# so I'm omitting it.

# Copy the npm files into your Docker image. If you do this first, the docker
# daemon can cache the built layers, making your images build faster and be 
# substantially smaller, since most of your dependencies will remain unchanged
# between builds.
COPY src/package.json package.json
COPY src/npm-shrinkwrap.json npm-shrinkwrap.json

# Actually install the dependencies.
RUN npm install

# Copy all of your source files from the `src` directory into the Docker image.
COPY src .

现在,这里有一个问题:您可能已在npm下安装了src/node_modules个模块。因此,除了最终的COPY行之外,您可以放弃上述所有内容,也可以将src/node_modules添加到构建根目录中的.dockerignore文件中(../..)。