在Dockerfile中运行linux命令引发错误

在Dockerfile中运行linux命令引发错误,linux,docker,docker-compose,environment-variables,dockerfile,Linux,Docker,Docker Compose,Environment Variables,Dockerfile,这是我的Dockerfile内容,它在运行此语句时不断向我抛出错误。知道我做错了什么吗。我只想将ENV VARS转储到容器上的React build文件中 FROM node:12 WORKDIR /usr/src/app COPY . . RUN printenv | grep REACT_APP_ > client/.env # RUN ["printenv", "|", "grep", "REACT_APP_&qu

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

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" ]
错误:
错误:服务“”无法生成:命令“printenv | grep REACT_APP>client/.env”返回非零代码:1


我花了好几个小时都不走运。感谢您的帮助。

因此,有几件事需要考虑:

  • 确保客户端目录存在。它不在节点中:12图像本身
  • 确保env有一个变量,允许
    grep REACT\u APP
    查找某些内容。如果没有,grep将返回1,docker映像构建将停止。1是grep找不到任何内容时的正常返回码,因此它不是错误(因此不会打印更多内容)。但是docker构建将其视为错误,因为它不是零,因此构建停止
  • 还要阅读man grep页面上的出口代码

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

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

    我得到的输出是:

    $ 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
    

    在您引用的“it failed”行之前是否有更多错误消息?如果映像中没有
    printenv
    命令(它不是标准的Unix命令),或者
    client
    目录不存在,则可能会发生这种情况。我只是通过将命令更改为
    RUN env>client/.env
    文件而取得了一些进展,但它是空的。在此步骤中,环境变量不可用或不可读。当我登录并运行相同的命令时,我会看到所有ENV VARS@davidmaze,这并不奇怪:基本
    节点:12
    映像不太可能定义任何特定于React的环境变量,并且在此之前您不会通过
    ENV
    语句来设置它们。(使用
    docker run-e
    或docker Compose
    environment:
    选项设置的任何内容都不会被考虑,除非您在Dockerfile中的所有内容完成后启动一个容器。)谢谢<代码>环境反应应用程序11是我的问题。我没有在Dockerfile中设置环境变量
    $ 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