You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker部署Phoenix服务时CSS和图片资源无法渲染如何解决?

问题成因
  • 缺失Assets编译依赖:Phoenix的静态资源不会直接从assets目录提供服务,需要先通过Node.js生态的工具编译打包到priv/static目录才能被Phoenix服务识别。你当前使用的基础镜像没有安装Node.js、npm等Assets编译必需的依赖,也没有执行对应的编译步骤,自然无法生成可用的静态资源文件。
  • 构建流程缺少Assets编译环节:你的Dockerfile仅完成了Elixir依赖的拉取和编译,没有执行npm install安装前端依赖、也没有执行mix assets.build(开发环境)或mix assets.deploy(生产环境)这类Assets编译命令,priv/static目录下没有编译完成的静态资源产物。
  • 卷挂载覆盖构建产物:Docker Compose中你配置了本地目录挂载到容器的/app路径,就算你在镜像构建阶段完成了Assets编译,启动容器时本地目录中不存在对应编译产物,会直接覆盖掉镜像内构建生成的priv/static内容,导致编译好的资源丢失。
修复方案

1. 调整Dockerfile

补充Assets编译所需的依赖和对应步骤,优化镜像分层缓存:

FROM elixir:alpine

# 新增Node.js、npm依赖用于Assets编译
RUN apk add --no-cache build-base git nodejs npm

WORKDIR /app

RUN mix local.hex --force && \
    mix local.rebar --force

# 单独复制依赖文件,充分利用Docker缓存
COPY mix.exs mix.lock ./
RUN mix deps.get
RUN mix deps.compile

# 单独安装前端依赖,缓存分层
COPY assets/package.json assets/package-lock.json ./assets/
RUN npm install --prefix assets

COPY . .

# 执行Assets编译,生成静态资源到priv/static
RUN mix assets.build

CMD ["mix", "phx.server"]

2. 调整Docker Compose配置

避免本地挂载覆盖容器内的依赖和编译产物,在web服务的volumes配置中新增匿名卷,排除不需要被本地覆盖的路径:

version: '3.6'
services:
  db:
    environment:
      PGDATA: /var/lib/postgresql/data/pgdata
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_HOST_AUTH_METHOD: trust
    image: 'postgres:11-alpine'
    restart: always
    volumes:
      - 'pgdata:/var/lib/postgresql/data'
  web:
    build: .
    depends_on:
      - db
    environment:
      MIX_ENV: dev
    env_file:
      - .env
    ports:
      - '4000:4000'
    volumes:
      - .:/app
      # 新增以下匿名卷,避免本地目录覆盖容器内的依赖和编译产物
      - /app/deps
      - /app/assets/node_modules
      - /app/priv/static
volumes:
  pgdata:

3. 可选开发环境优化

如果需要在开发过程中实时编译修改的Assets,可检查config/dev.exs中的watchers配置,默认已内置esbuild监听逻辑,启动服务后会自动编译修改的静态资源,无需每次重启容器重新构建。

学习资源推荐
  • Phoenix官方文档部署章节:包含开发、生产环境下Docker部署的标准化流程和最佳实践
  • Elixir官方Mix & OTP指南发布部分:覆盖Elixir项目发布的全流程逻辑,可直接适配Docker部署场景
  • 主流CI/CD平台的Elixir专用配置模板:包含构建、测试、静态检查、部署全环节的配置示例,可直接复用调整

内容的提问来源于stack exchange,提问作者jacksonbenete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:36:03