可写的node_modules,包含docker

时间:2017-08-09 12:52:50

标签: node.js docker docker-compose dockerfile node-modules

我的webapp/Dockerfile看起来像这样:

FROM project_base-container

EXPOSE 9100

# ...

# Using copy instead of mount, since we need to write in sub-directories like node_modules etc.
COPY . /usr/src/app/webapp

CMD ["bash", "webapp/scripts/build_and_run.sh", "setup_deps_and_run_app"]

我想让应用程序能够读取源代码并写入node_modules等子文件夹,但我不希望这些更改进入我的本地计算机。因此,我有两个选择:

  1. 更改--prefix='/tmp'中的node install并将src挂载为ro
  2. 复制COPY src,然后容器可以在任何地方写入。
  3. 解决方案1破坏了破坏,因为现在我必须将所有文件(如package.json,index.html等)复制/链接到前缀位置。 解决方案2就是我上面所做的。

    当我使用COPY时,一切都很好。但现在的问题是,在源代码发生变化后,我想每次都更新图像中的源代码:

    sudo docker-compose down && sudo docker-compose up --build -d
    

    但是COPY命令由docker缓存,即使在文件更改后也不会更新。

    TL; DR:我有一个src文件夹'webapp',我想从主机挂载为readonly,但我的应用程序想要写入子文件夹'webapp / node_modules'。

3 个答案:

答案 0 :(得分:2)

要在只读装载体内创建可写装载,您需要确保只读目录具有装载点(文件夹),即使它们是空的

要创建空挂载点并提交它们,请参阅this answer

对于运行节点,您需要关注4个可写文件夹:

$ mkdir webapp/frontend/node_modules webapp/frontend/build webapp/frontend/.config webapp/frontend/.npm

$ cat > webapp/frontend/node_modules/.gitignore
# Ignore everything in this directory
*
# Except this file
!.gitignore

$ git add -f webapp/frontend/node_modules/.gitignore

$ cat docker-compose.yml  # Filtered output below
version: "2"
services:
    webapp:
        build: ./webapp
        expose:
          - "9900"
        # Named volumes, defined below.
        volumes:
          - ./webapp:/usr/src/app/webapp:ro
          - webapp_config:/usr/src/app/webapp/frontend/.config:rw
          - webapp_npm:/usr/src/app/webapp/frontend/.npm:rw
          - webapp_node_modules:/usr/src/app/webapp/frontend/node_modules:rw
          - webapp_build:/usr/src/app/webapp/frontend/build:rw
          - ./config.ini:/usr/src/app/config.ini:ro
# Named volumes. These will stay in the host, but not in the current directory.
volumes:
      webapp_node_modules:
      webapp_build:
      webapp_config:
      webapp_npm:

答案 1 :(得分:0)

您可以使用内部docker-volumes。

version: "3"

services:

  postgres:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/db

  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - ./data:/data

volumes:
  db-data:

From documentation

阐释:

Postgress服务使用命名卷,它位于安装docker的目录中。对于Ubuntu,它是/var/lib/docker/aufs/。此目录可能不同,可以使用docker inspect <vulume_name>找到。

Redis服务使用另一种类型的卷,这些卷更受欢迎,用于在容器目录中挂载主机目录。 data文件夹与docker-compose.yml文件所在的目录位于同一目录中,此文件夹安装在/data的容器内。

答案 2 :(得分:0)

您是否可以在一些子目录中存储您想要编辑的所有代码(比如src)?如果是,那么您可以执行以下操作

  • 正如您现在所做的那样使用COPY,这可能是部署所需要的。
  • 此外(只读)在开发过程中将src挂载到/usr/src/app/webapp/src