簡體   English   中英

dockerfile命令不生效

[英]Command in dockerfile doesn't take effect

下面是我的 dockerfile。安裝依賴項后,我想從容器上的node_modules文件夾中刪除特定的二進制文件 ( ffmpeg ),然后使用 node_modules 中同一文件夾下的install.js文件重新安裝它。

FROM node:16-alpine

WORKDIR /web

COPY package.json package-lock.json ./

ARG NODE_ENV
ENV NODE_ENV ${NODE_ENV:-development}

ARG _ENV
ENV _ENV ${_ENV:-dev}

RUN npm install

RUN rm /web/node_modules/ffmpeg-static/ffmpeg
RUN node /web/node_modules/ffmpeg-static/install.js

COPY . .

EXPOSE 8081
ENTRYPOINT [ "npm" ]

我希望rmnode命令在啟動后以及所有依賴項安裝並復制到容器時對容器生效,但它沒有發生。 我覺得RUN之后的命令只在構建過程中執行,而不是在容器啟動后執行。

容器啟動后,當我 ssh 到它並直接執行上面的兩個命令( RUN rm...RUN node... )時,我的更改正在生效並且一切正常。 我基本上希望這些命令在容器啟動並運行后自動運行。

docker-compose.yaml 文件如下所示:

version: '3'
services:
  serverless:
    build: web
    user: root
    ports:
      - '8081:8081'

    env_file:
      - env/web.env
    environment:
      - _ENV=dev
    command:
      - run
      - start
    volumes:
      - './web:/web'
      - './env/mount:/secrets/'

如果這個dockerfile構建,則意味着你有一個 package-lock.json。 這證明 npm install 是在該映像的根目錄中執行的,這意味着 node_modules 存在於本地並且正在復制到最后一個副本中。

您可以通過創建一個包含文件和目錄(又名 node_modules)的.dockerignore文件來避免這種情況,您希望將這些文件和目錄從傳遞到 Docker 構建上下文中排除,這將確保它們不會被復制到您的最終圖像.

你可以按照這個例子: https://stackoverflow.com/a/43747867/3669093

更新

Dockerfile:將 ENTRYPOINT 替換為以下內容

ADD ./start.sh /start.sh
CMD ["/start.sh"]

啟動.sh

rm /web/node_modules/ffmpeg-static/ffmpeg
node /web/node_modules/ffmpeg-static/install.js

npm

試試rm -rf /web/node_modules/ffmpeg-static/ffmpeg

我假設那是目錄,而不是文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM