Docker/Reactjs/Nodejs-如何在Docker组合后安装依赖项并运行应用程序



我正在尝试将Reactjs应用程序与Nodejs服务器对接。在许多示例中,我们必须在Dockerfile中安装依赖项,但我希望在容器使用脚本启动后再安装。有可能做到吗?

我的docker撰写文件:

version: '3.7'
services:
web-server:
container_name: webserver
build:
context: ./docker/web-server
dockerfile: ./Dockerfile
ports:
- "3000:3000"
volumes:
- .:/usr/src/app
working_dir: /usr/src/app

我的Dockerfile:

FROM node:alpine
COPY scripts/docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 3000

我的docker入口点.sh:

#!/bin/sh
[ ! -d "node_modules" ] && npm install
ls -la
npm start

容器日志:

total 644
drwxrwxr-x    8 node     node          4096 Oct  3 12:19 .
drwxr-xr-x    3 root     root          4096 Oct  3 12:19 ..
-rw-rw-r--    1 node     node             0 Oct  3 12:16 .dockerignore
drwxrwxr-x    8 node     node          4096 Oct  2 23:57 .git
-rw-rw-r--    1 node     node           317 Oct  2 22:23 .gitignore
drwxrwxr-x    4 node     node          4096 Oct  3 12:52 .idea
-rw-rw-r--    1 node     node          2891 Oct  2 20:22 README.md
drwxrwxr-x    3 node     node          4096 Oct  2 23:57 docker
-rw-rw-r--    1 node     node           325 Oct  2 23:52 docker-compose.yml
drwxr-xr-x 1020 node     node         36864 Oct  3 12:19 node_modules
-rw-rw-r--    1 node     node        577492 Oct  2 20:23 package-lock.json
-rw-rw-r--    1 node     node           748 Oct  2 20:23 package.json
drwxrwxr-x    2 node     node          4096 Oct  2 20:22 public
drwxrwxr-x    2 node     node          4096 Oct  2 23:04 src
> docker-react@0.1.0 start /usr/src/app
> react-scripts start
ℹ 「wds」: Project is running at http://172.19.0.2/
ℹ 「wds」: webpack output is served from 
ℹ 「wds」: Content not from webpack is served from /usr/src/app/public
ℹ 「wds」: 404s will fallback to /
Starting the development server...

我想这样做,以保持与我在另一个项目上的Symfony API相同的安装逻辑。但我的榜样不起作用。

更新1:现在我正试图将我的项目构建成镜像,但在运行docker-compose up -d --build后仍然无法工作

Dockerfile:

FROM node:alpine
WORKDIR /usr/src/app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]

docker-compose.yml:

version: '3.7'
services:
web-server:
container_name: webserver
build:
context: .
dockerfile: ./docker/web-server/Dockerfile
ports:
- "3000:3000"

在我的docker-compose.yml中添加选项stdin_open: true解决了这个问题。

docker compose.yml:

version: "3.7"
services:
web-server:
container_name: webserver
build:
context: ./docker/web-server
dockerfile: ./Dockerfile
ports:
- "3000:3000"
stdin_open: true
environment:
- CHOKIDAR_USEPOLLING=true
- NODE_ENV=development
volumes:
- .:/usr/app
working_dir: /usr/app

Dockerfile:

FROM node:alpine
COPY scripts/docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

docker入口点.sh:

#!/bin/sh
[ ! -d "node_modules" ] && npm install
npm start

现在它对我有效。

最新更新