【问题标题】:Docker/Reactjs/Nodejs - How to install dependencies and run application after docker-compose upDocker/Reactjs/Nodejs - 如何在 docker-compose up 之后安装依赖项并运行应用程序
【发布时间】:2020-10-03 12:38:21
【问题描述】:

我正在尝试使用 Nodejs 服务器对 Reactjs 应用程序进行 dockerize。在许多示例中,我们必须在 Dockerfile 中安装依赖项,但我想在容器以脚本启动后执行此操作。 有可能吗?

我的 docker-compose 文件:

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-entrypoint.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"

【问题讨论】:

  • 如果主机绑定挂载已经有一个node_modules 目录(尝试在npm install 命令之前放置另一个ls 以查看),您将获得此行为。一般的 Docker 最佳实践是删除 volumes: 以使用内置到映像中的代码;您可以使用主机节点在前端工作(如果您想这样做,则每次都使用rm -rf node_modules; npm install; npm run start)。
  • 我尝试在没有脚本的情况下将项目构建为图像,但它仍然无法正常工作。看看我在主帖上的更新 1。
  • 怎么不工作?
  • 我去localhost:3000时什么都没有。该网站无法访问...

标签: node.js reactjs docker docker-compose


【解决方案1】:

在我的 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-entrypoint.sh:

#!/bin/sh

[ ! -d "node_modules" ] && npm install

npm start

现在它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2019-10-07
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多