我正在寻找一种在一个Docker容器中与另一个共享一个任意目录的方法,但又不能在容器创建之间持久化卷。

用例是在Web应用程序和Web服务器(如Nginx)之间共享静态 Assets 。两个容器均由图像构建。 Web应用程序的Dockerfile在构建时将静态 Assets 复制到/var/www/public之类的目录中。我想避免持久化卷,因为在构建Web应用程序时会更新静态 Assets 。

我已尝试使用类似于以下内容的docker-compose.yml进行此操作,但不幸的是,这会保留该卷,并且当使用新镜像重新创建容器时,不会更新共享卷的内容。

version: '3.5'

services:
  web:
    image: bswinnerton/nyc-restaurant-grades
    networks:
      - backend
    volumes:
      - www_data:/var/www/app/
  nginx:
    image: nginx
    depends_on:
      - web
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - www_data:/var/www/app/
    networks:
      - backend

volumes:
  www_data:

networks:
  backend:

Web应用程序的Dockerfile看起来像这样:
FROM ruby:2.5.1

# Install dependencies
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

# Set working directory, where the commands will be ran:
RUN mkdir -p /var/www/app
WORKDIR /var/www/app

# Adding gems
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install --jobs 20 --retry 5

# Adding project files
COPY . .

# Precompile assets
RUN bundle exec rails assets:precompile

CMD [ "bundle", "exec", "puma", "-C", "config/puma.rb" ]

我考虑过使用tmpfs挂载,但是看来它们无法在容器之间共享。

最佳答案

如果您希望在Docker / Compose环境中执行此操作,则可能只需要使用磁盘上的文件夹并在启动容器时对其进行配置。另一种选择是让您的构建管道使用docker cp将文件从一个镜像复制到另一个镜像,再复制到构建环境,并在后续的Dockerfile中将COPY复制(假定它们是静态文件)。

如果您希望在Kubernetes中进行此操作,则可以使用emptyDir卷和具有多个容器(边车)的 pods 来实现。

关于docker - Docker中的临时共享卷,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52043263/

10-16 23:01