首页 > 解决方案 > Docker Ignore 不适用于 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

码头工人/应用程序/Dockerfile

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

码头工人-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 中,我也有同样的问题。

标签: ruby-on-railsdockerdocker-composedockerfile

解决方案


在构建时,指令COPY . .(在 内)正确复制所有未在(图像内)中Dockerfile列出的文件。这里没问题(通过运行检查)。.dockerignore$RAILS_ROOTdocker 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.0docker-compose

如果您确实需要在主机和容器之间共享文件(通过卷),我建议您将当前目录安装在您指定的位置以外的另一个位置Dockerfile,例如:

volumes:
    - .:/${APP_NAME}_web

否则,在这里使用COPY . .和卷是多余的。


推荐阅读