我制作的应用程序是用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"
}
}
答案 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"
}
}