【问题标题】:How to run a command before CMD in dockerfile?如何在dockerfile中的CMD之前运行命令?
【发布时间】:2022-11-01 18:54:39
【问题描述】:

我有一个看起来像这样的 dockerfile:

FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
ADD . /app
CMD python script.py

(requirements.txt 包含“黑色”)。

我想在运行 script.py 之前在 script.py 上运行 black,以便在容器启动时正确格式化 script.py。我不明白我应该怎么做,因为我知道我不能使用 CMD 两次。我觉得我错过了应该如何使用 docker。

【问题讨论】:

  • 虽然它不是重复的,但我相信问题本身here 回答您的问题。另见here
  • RUN black script.py 会成功的,我相信。
  • RUN black script.py 不起作用。我可以看到它在日志中运行,但它不影响 script.py。
  • Black 看起来像是在你的主机系统上运行的东西;如果格式正确的代码已经签入源代码管理,则在构建 Docker 映像时不需要重新格式化(尤其是在每次运行容器时)。
  • so that script.py get formatted correctly when the container starts 为什么要关心脚本是否在容器内格式化?

标签: python docker dockerfile


【解决方案1】:

另外尽量不要使用 ADD,COPY 几乎总是更好,只有在从链接复制文件或复制压缩文件时才使用 ADD。

【讨论】:

  • 无论如何,这并不能回答这个问题。在不说明原因或指向文档的情况下发表一次性声明是绝不有用
【解决方案2】:

解决方案是here。 就我而言,它是:

Dockerfile:

FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
ADD . /app
ADD start.sh /
RUN chmod +x /start.sh

CMD ["/start.sh"]

开始.sh:

#!/bin/bash

black script.py
python script.py

【讨论】:

  • 为什么每次运行容器时都运行黑色。像其他人建议的那样在 docker 文件中运行 black 会更有意义,因此它只在容器构建时运行一次。
  • 我不明白。 “不要在 dockerfile 中运行黑色,你应该在 docker 文件中运行它”。
  • 我是说,每次运行容器时不要运行黑色。而是在其自身的 dockerfile 中运行 black,因此它仅在构建映像时运行一次。目前,每次运行容器时都会运行黑色,这是毫无意义的
猜你喜欢
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多