如何从 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 多个容器