[英]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" ]
我希望rm
和node
命令在啟動后以及所有依賴項安裝並復制到容器時對容器生效,但它沒有發生。 我覺得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.