Docker Ignore 与 docker compose 和我的文件结构配合得不好

问题描述 投票:0回答:3

我正在设置一个新的 dockerfile 和 docker-compose.yml。下面我将首先使用 Rails 显示我的文件结构,我想使用新的 .dockerignore 来忽略 node_modules.git .

我的docker版本是:Docker版本18.09.0,构建4d60db4

我的 docker-compose.yml 比我使用的是 v3

根目录

- Gemfile
- app
- bin
- cable
- db
- config
- lib
- node_modules
- public
- vendor
- docker
  - app
    - Dockerfile
- .git
- .gitignore
- .dockerignore
- docker-compose.yml

docker/app/Dockerfile

FROM ruby:2.3.1
ARG RAILS_ROOT
RUN mkdir -p $RAILS_ROOT
WORKDIR $RAILS_ROOT
COPY . .

docker-compose.yml


version: '3'
services:
  app:
    build: &build_core
      context: .
      dockerfile: ./docker/app/Dockerfile
      args:
        - APP_NAME=myappname
        - RAILS_ROOT=/var/www/${APP_NAME}_web
        - RAILS_ENV=development
        - RAILS_SERVE_STATIC_FILES=true
        - RAILS_LOG_TO_STDOUT=true
        - BUNDLE_OPTIONS=
        - NPM_OPTIONS=
    image: custom-web:1.0
    container_name: app
    volumes:
      - .:/var/www/${APP_NAME}_web
    env_file:
      - .env
    environment:
      RAILS_ROOT: "/var/www/${APP_NAME}_web"

.dockerignore


.git/
node_modules/

我用下一个命令构建了我的图像

docker-compose build app

当我查看容器时,文件仍在复制到我的容器中

也许是上下文或者我应该将 .dockerignore 放在哪里,我也将 .dockerignore 放入 docker/app/.dockerignore 中,我也遇到了同样的问题。

docker docker-compose dockerfile
3个回答
37
投票

在构建时,指令

COPY . .
(在
Dockerfile
内)正确地将所有未在
.dockerignore
中列出的文件复制到
$RAILS_ROOT
中(在图像内)。这里没问题(通过运行
docker run --rm custom-web:1.0 ls -al
检查)。

但是在这里你运行

docker-compose
来启动容器,并且你已经定义了一个卷:

volumes:
    - .:/var/www/${APP_NAME}_web

这意味着与

docker-compose.yml
位于同一目录的文件在主机和容器之间共享。这就是为什么在通过
.dockerignore
启动容器后,您会在
$RAILS_ROOT
custom-web:1.0
图像的工作目录)中找到所有文件(甚至是
docker-compose
中列出的文件)。

如果您确实需要在主机和容器之间共享文件(通过卷),我建议您将当前目录挂载到

Dockerfile
中指定的位置之外的其他位置,例如:

volumes:
    - .:/${APP_NAME}_web

否则,使用

COPY . .
和卷在这里是多余的。


16
投票

我遇到了同样的问题,

docker build
node_modules
目录没有被忽略。

解决方案

node_modules
更改为
**/node_modules
内的
.dockerignore
解决了我的问题。


3
投票

根据此相关答案,您可以安装主目录,但使用

node_modules
中的第二个匿名卷忽略
docker-compose.yml
。这允许您镜像您的目录,但容器应该保留自己的node_modules。

volumes:
  - .:/var/www/${APP_NAME}_web
  - /var/www/${APP_NAME}_web/node_modules/
© www.soinside.com 2019 - 2024. All rights reserved.