强制更新Docker Compose中的共享卷



UI图像的Docker文件如下

FROM node:alpine as prodnode
WORKDIR /app
COPY ./package.json ./
RUN npm i
COPY . .
CMD ["npm", "run", "build"]

我的Docker Compose清单如下所示。

version: "3"
services:
nginx:
depends_on:
- backend
- ui
restart: always
volumes:
- ./nginx/prod.conf:/etc/nginx/conf.d/default.conf
- static:/usr/share/nginx/html
build:
context: ./nginx/
dockerfile: Dockerfile
ports:
- "80:80"
backend:
build:
context: ./backend/
dockerfile: Dockerfile
volumes:
- /app/node_modules
- ./backend:/app
environment:
- PGUSER=postgres
- PGHOST=postgres
- PGDATABASE=postgres
- PGPASSWORD=postgres_password
- PGPORT=5432
ui:
tty: true
stdin_open: true
environment:
- CHOKIDAR_USEPOLLING=true
build:
context: ./ui/
dockerfile: Dockerfile
volumes:
- /app/node_modules
- ./ui:/app
- static:/app/build
postgres:
image: "postgres:latest"
environment:
- POSTGRES_PASSWORD=postgres_password
volumes:
static:

我正在尝试构建静态内容,并在ui容器和Nginx容器之间复制内容。我使用共享音量。一切都如预期的那样顺利。但当我更改ui的内容并重新构建时,这些更改并没有反映出来。我尝试了以下方法:

docker-compose down
docker-compose up --build 
docker-compose up 

它们都没有用新的构建替换静态内容。

只有当我删除像下面这样的静态音量时

docker volume rm skeleton_static

然后做

docker-compose up --build 

它现在正在更改内容。如何自动替换每个docker-compose updocker-compose up --build上的静态内容?

命名卷被认为以Docker无法理解的某种格式保存用户数据;Docker在最初创建内容后从不更新其内容,如果您将卷装载到图像内容上,则卷中的旧内容会隐藏图像中的更新内容。因此,我会在这里避免命名卷。

在您显示的设置中,ui容器实际上并没有做任何事情:它的主要容器过程是构建应用程序,然后立即退出。在这里,多阶段构建是一种更合适的方法,它可以让您在映像构建阶段编译应用程序,而无需声明无所事事的容器或添加命名卷的复杂性。

# ui/Dockerfile
# First stage: build the application; note this is
# very similar to the existing Dockerfile
FROM node:alpine as prodnode
WORKDIR /app
COPY ./package.json ./
RUN npm i
COPY . .
RUN ["npm", "run", "build"] # not CMD
# Second stage: nginx server serving that application
FROM nginx:latest
COPY --from=prodnode /app/build /usr/share/nginx/html
# use default CMD from the base image

在您的docker-compose.yml文件中,您不需要单独的";构建";以及";服务";容器,这些现在组合在一起。

version: "3.8"
services:
backend:
build: ./backend
environment:
- PGUSER=postgres
- PGHOST=postgres
- PGDATABASE=postgres
- PGPASSWORD=postgres_password
- PGPORT=5432
depends_on:
- postgres
# no volumes:
ui:
build: ./ui
depends_on:
- backend
ports:
- '80:80'
# no volumes:
postgres:
image: "postgres:latest"
environment:
- POSTGRES_PASSWORD=postgres_password
volumes: # do persist database data
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:

类似的问题将适用于您用于后端服务的node_modules目录的匿名卷,并且它将忽略对package.json文件的任何更改。由于应用程序的所有代码和库依赖项都已包含在映像中,因此我删除了会覆盖这些依赖项的volumes:块。

最新更新