如何从 docker 容器运行 webpack 构建?

Posted

技术标签:

【中文标题】如何从 docker 容器运行 webpack 构建?【英文标题】:How do I run a webpack build from a docker container? 【发布时间】:2018-01-10 07:43:51 【问题描述】:

我正在制作的应用程序是用 ES6 编写的,其他好东西是由 webpack 在 Docker 容器中转译的。目前一切正常,从创建内部目录、安装依赖项和创建编译的包文件。

当运行容器时,它说 dist/bundle.js 不存在。除非我在主机目录中创建捆绑文件,否则它将起作用。

我尝试在第一次工作时为 dist 目录创建一个卷,但在进行更改并重建后,它并没有获取新的更改。

我想要实现的是让容器构建并运行已编译的包。我不确定 webpack 部分是否应该在 Dockerfile 中作为构建步骤或在运行时,因为 CMD ["yarn", "start"] 崩溃但 RUN ["yarn", "start"] 有效。

感谢任何建议和帮助。提前致谢。

|_src
  |_index.js
|_dist
  |_bundle.js
|_Dockerfile
|_.dockerignore
|_docker-compose.yml
|_webpack.config.js
|_package.json
|_yarn.lock

docker-compose.yml

version: "3.3"
services:
  server:
    build: .
    image: selina-server
    volumes:
      - ./:/usr/app/selina-server
      - /usr/app/selina-server/node_modules
      # - /usr/app/selina-server/dist
    ports:
      - 3000:3000

Dockerfile

FROM node:latest

LABEL version="1.0"
LABEL description="This is the Selina server Docker image."
LABEL maintainer="AJ alvaroo@selina.com"

WORKDIR "/tmp"

COPY ["package.json", "yarn.lock*", "./"]

RUN ["yarn"]

WORKDIR "/usr/app/selina-server"

RUN ["ln", "-s", "/tmp/node_modules"]

COPY [".", "./"]

RUN ["yarn", "run", "build"]

EXPOSE 3000

CMD ["yarn", "start"]

.dockerignore

.git
.gitignore

node_modules
npm-debug.log

dist

package.json


  "scripts": 
    "build": "webpack",
    "start": "node dist/bundle.js"
  

【问题讨论】:

【参考方案1】:

通过在webpack.config.js 中添加以下行,我可以在浏览器中使用webpack 获得docker 服务:

module.exports = 
  //...
  devServer: 
    host: '0.0.0.0',
    port: 3000
  ,
;

Docker 似乎希望内部容器地址为0.0.0.0 而不是localhost,这是webpack 的默认字符串。更改webpack.config.js 规范并在构建容器时将其复制到容器中,可以在主机上的“http://localhost:3000”上识别正确的端口。它适用于我的项目;希望它对你有用。

【讨论】:

【参考方案2】:

我没有包含我的 src 树结构,但它与你的基本相同, 我使用以下 docker 设置来让它运行以及我们每天开发东西的方式。

在 package.json 我们有

"scripts": 
    "start": "npm run lint-ts && npm run lint-scss && webpack-dev-server --inline --progress --port 6868",

码头文件

FROM node:8.11.3-alpine

WORKDIR /usr/app

COPY package.json .npmrc ./

RUN mkdir -p /home/node/.cache/yarn && \
  chmod -R 0755 /home/node/.cache && \
  chown -R node:node /home/node && \
  apk --no-cache add \
  g++ gcc libgcc libstdc++ make python

COPY . .

EXPOSE 6868

ENTRYPOINT [ "/bin/ash" ]

docker-compose.yml 版本:“3”

volumes:
  yarn:

services:
  web:
    user: "1000:1000"
    build:
      context: .
      args:
        - http_proxy
        - https_proxy
        - no_proxy
    container_name: "some-app"
    command: -c "npm config set proxy=$http_proxy && npm run start"
    volumes:
      - .:/usr/app/
    ports:
      - "6868:6868"

请注意,此 Dockerfile 不适用于生产环境,它适用于开发环境,因为它以 root 身份运行。

有了这个 docker 文件,它就有了一个陷阱。

因为 alpine 在 musl 上,而我们在 glib 上,如果我们在主机上安装节点模块,编译后的 native 将无法在 docker 容器上运行,一旦容器启动,如果您遇到错误,我们会运行它来修复它(它现在有点像贴膏药)

docker-compose exec container_name_goes_here /bin/ash -c "npm rebuild node-sass --force"

ikky 但它有效。

【讨论】:

【参考方案3】:

尝试更改package.json 中的启动脚本以首先执行构建(这样做,您将不需要RUN 命令在Dockerfile 中执行构建:


  "scripts": 
    "build": "webpack",
    "start": "webpack && node dist/bundle.js"
  

【讨论】:

以上是关于如何从 docker 容器运行 webpack 构建?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在运行 docker-toolbox 的 Windows 上使用 docker-compose 在 docker 容器内运行 webpack-dev-server 时出现“来自服务器的空回复”

Docker + Webpack (Dev Server) + Yarnpkg 不完整的构建

将图像从公共 Docker Hub 拉取到 AWS Elastic Beanstalk 多个容器

Dockerized webapp - 热重新加载

如何从另一个容器访问在 Docker 容器中运行的 Mopidy

Kubernetes:如何从 Docker 容器 A 在 Docker 容器 B 上运行 Bash 命令