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

时间:2017-08-02 22:01:08

标签: node.js docker webpack docker-compose devops

我制作的应用程序是用ES6编写的,其他好东西是由Docker容器中的webpack编写的。目前,一切都可以从创建内部目录,安装依赖项和创建已编译的bundle文件开始。

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

我已尝试为dist目录创建一个卷,它第一次运行,但在进行更改和重建之后,它不会获取新的更改。

我想要实现的是拥有容器构建并运行已编译的bundle。我不确定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

搬运工-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"
  }
}

3 个答案:

答案 0 :(得分:2)

通过将以下几行添加到 webpack,我能够在浏览器中使用 webpack.config.js 获取 docker 服务:

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

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

答案 1 :(得分:0)

我没有包括src树结构,但它与您的树结构基本相同, 我使用以下docker设置来运行它,以及它每天如何开发东西。

在package.json中,我们有

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

dockerfile

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上,那么编译后的本机将无法在docker容器上运行。一旦容器出现错误,我们将运行它来修复它(现在有点像膏药了

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

ikky但它可以工作。

答案 2 :(得分:0)

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

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