【问题标题】:Conditional CMD in DockerDocker 中的条件 CMD
【发布时间】:2021-12-18 03:44:13
【问题描述】:

如果 package.json 中存在开发脚本,我想运行 CMD ["npm", "run", "dev"],否则运行 CMD ["npm", "start"]

有没有一种惯用的 docker 方式来做到这一点?我想我的 CMD 可能是一个检查“npm run dev”是否存在的 bash 脚本。还有比这更干净的方法吗?

【问题讨论】:

  • 您可以编写一个 bash 脚本并运行它。在 Docker 中运行不必要的命令会创建更多层——这很糟糕。可以使用这样的东西。 if [ -e "$file_name" ]; then echo "File exists" fi
  • 参考Minimize Docker Layersdocs.docker.com/engine/userguide/eng-image/…

标签: node.js docker npm


【解决方案1】:

您可以动态创建包含适当命令的bash 脚本:

RUN bash -c "if npm run | grep -q dev ; then echo npm run dev > run.sh; else echo npm start > run.sh; fi; chmod 777 run.sh;"
CMD ./run.sh
  • if npm run | grep -q dev 将检查dev 脚本是否存在于package.json 中。不带参数运行 npm run 将列出所有可运行的脚本,grep -q dev 将仅在 dev 包含在其中时返回 true

  • echo command > run.sh 将使用提供的命令创建一个文件

  • chmod 777 run.sh 将使run.sh 可执行

  • CMD ./run.sh 将执行创建的文件

【讨论】:

    【解决方案2】:

    Dockerfile 语法不涵盖此类用例。您必须依靠脚本来实现。

    【讨论】:

      【解决方案3】:

      在 Dockerfile 中读取 package.json 没有任何意义。您可以做的是为开发环境提供单独的 Dockerfile 和另一个不包含“dev”命令的 Dockerfile。这种方式也可以让您更好地控制正在构建的 Docker 映像。

      【讨论】:

        猜你喜欢
        • 2018-08-08
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多