【问题标题】:Running a linux command in Dockerfile throwing error在 Dockerfile 中运行 linux 命令引发错误
【发布时间】:2021-01-04 22:06:24
【问题描述】:

这是我的 Dockerfile 内容,它在运行此语句时不断向我抛出错误。知道我做错了什么。我只想将 ENV VARS 转储到一个文件中,以便在容器上构建 React。

FROM node:12
WORKDIR /usr/src/app
COPY . .
RUN printenv | grep REACT_APP_ > client/.env
# RUN ["printenv", "|", "grep", "REACT_APP_", ">", "client/.env"]
RUN npm run setup
RUN npm run build:all

EXPOSE 3005
CMD [ "npm", "run", "start:prod" ]

错误:ERROR: Service '<name>' failed to build: The command 'printenv | grep REACT_APP_ > client/.env' returned a non-zero code: 1

我花了很多时间都没有运气。帮助表示赞赏。

【问题讨论】:

  • 您引用的“失败”行之前是否还有更多错误消息?如果printenv 命令不在映像中(它不是标准的 Unix 命令)或client 目录不存在,则可能会发生这种情况。
  • 我刚刚通过将命令更改为RUN env > client/.env 取得了一些进展,生成了文件但它是空的。看起来 ENV VARS 在此步骤不可用或不可读。当我登录并运行相同的命令时,我会看到所有 ENV VARS @DavidMaze
  • 这并不奇怪:基本的node:12 图像不太可能定义任何特定于 React 的环境变量,并且在此之前您不会通过 ENV 语句设置它们。 (您使用docker run -e 或Docker Compose environment: 选项设置的任何内容都不会被考虑,直到您启动容器,在Dockerfile 中的所有内容都完成之后。)

标签: linux docker docker-compose environment-variables dockerfile


【解决方案1】:

所以有几点需要考虑:

  1. 确保客户端目录存在。它不会单独出现在 node:12 图像中
  2. 确保环境中有一个变量可以让grep REACT_APP_ 找到一些东西。如果没有,grep 将返回 1 并且 docker 映像构建将停止。当 grep 什么也没找到时, 1 是正常的返回码,所以这不是错误(因此不会打印更多内容)。但 docker build 将其视为错误,因为它不为零,因此构建停止。

还可以阅读 man grep 页面上的 EXIT CODES,

EXIT STATUS 通常,如果选择了一行,则退出状态为 0,如果选择了行,则为 1 未选择任何行,如果发生错误则选择 2。

这是我做的一个通过的测试(稍作修改,仅基于上述考虑):

FROM node:12
WORKDIR /usr/src/app
COPY . .
RUN mkdir client
ENV REACT_APP_1 1
RUN printenv | grep REACT_APP_ > client/.env
RUN cat client/.env

我得到的输出是这样的:

$ docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM node:12
 ---> 28faf336034d
Step 2/7 : WORKDIR /usr/src/app
 ---> Running in 753293fa6257
Removing intermediate container 753293fa6257
 ---> 3a04798b1b9f
Step 3/7 : COPY . .
 ---> 3dd0d465a6e2
Step 4/7 : RUN mkdir client
 ---> Running in d513df2a0a34
Removing intermediate container d513df2a0a34
 ---> d46aa5200ae7
Step 5/7 : ENV REACT_APP_1 1
 ---> Running in af81940a90fb
Removing intermediate container af81940a90fb
 ---> 6169ad694a4d
Step 6/7 : RUN printenv | grep REACT_APP_ > client/.env
 ---> Running in 365020eeb2e5
Removing intermediate container 365020eeb2e5
 ---> b6ef574c48c8
Step 7/7 : RUN cat client/.env
 ---> Running in a6a69d6ba6c2
REACT_APP_1=1
Removing intermediate container a6a69d6ba6c2
 ---> 0814306133f0
Successfully built 0814306133f0
Successfully tagged test:latest

【讨论】:

  • 谢谢! ENV REACT_APP_1 1 是我的问题。我没有在 Dockerfile 中设置 ENV VARS
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-17
  • 2022-12-12
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多