我正在寻找一种在一个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/