Docker Ignore对于docker compose和我的文件结构没有很好的了解

Dar*_*avo 3 ruby-on-rails docker dockerfile docker-compose

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

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

我使用的docker-compose.ymlv3

根目录

- Gemfile
- app
- bin
- cable
- db
- config
- lib
- node_modules
- public
- vendor
- docker
  - app
    - Dockerfile
- .git
- .gitignore
- .dockerignore
- docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

码头工人/应用程序/码头文件

FROM ruby:2.3.1
ARG RAILS_ROOT
RUN mkdir -p $RAILS_ROOT
WORKDIR $RAILS_ROOT
COPY . .
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

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

Duk*_*e79 11

我遇到了同样的问题docker buildnode_modules目录没有被忽略。

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


nor*_*bjd 5

在构建时,伪指令COPY . .(位于内Dockerfile)正确复制了未在.dockerignore中列出的所有文件$RAILS_ROOT(在映像内)。没问题(通过运行进行检查docker run --rm custom-web:1.0 ls -al)。

但是在这里,您运行docker-compose启动容器,并定义了一个卷:

volumes:
    - .:/var/www/${APP_NAME}_web
Run Code Online (Sandbox Code Playgroud)

这意味着docker-compose.yml主机和容器之间共享同一目录中的文件。因此,通过启动容器后,您会.dockerignore$RAILS_ROOTcustom-web:1.0图像的工作目录)中找到所有文件(甚至是列出的文件)docker-compose

如果您确实需要(通过卷)在主机和容器之间共享文件,建议您将当前目录挂载到不同于您指定的目录的其他位置Dockerfile,例如:

volumes:
    - .:/${APP_NAME}_web
Run Code Online (Sandbox Code Playgroud)

否则,COPY . .在此处使用和卷是多余的。