我的檔案夾結構如下所示:

我的 Dockerfile 看起來像這樣:
FROM python:3.8-slim-buster
WORKDIR /src
COPY src/requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ .
CMD [ "python", "main.py"]
當我運行這些命令時:
docker build --tag FinTechExplained_Python_Docker .
docker run free
我的main.py檔案運行并給出了正確的列印陳述句。現在,我tests.py在src檔案夾中添加了另一個檔案。我想先運行tests.py,然后再運行main.py。
我嘗試cmd像這樣修改我的docker檔案中的:
CMD [ "python", "test.py"] && [ "python", "main.py"]
但它只給了我第一個test.py檔案的列印陳述句。
我閱讀了 docker-compose 并將此docker-compose.yml檔案添加到根檔案夾:
version: '3'
services:
main:
image: free
command: >
/bin/sh -c 'python tests.py'
main:
image: free
command: >
/bin/sh -c 'python main.py'
然后我通過洗掉 cmd 更改了我的 docker 檔案:
FROM python:3.8-slim-buster
WORKDIR /src
COPY src/requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ .
然后我運行了以下命令:
docker compose build
docker compose run tests
docker compose run main
當我分別運行這些命令時,我得到了正確的列印陳述句tests和main. 但是,我不確定我docker-compose是否正確使用。
- 我應該分別運行這兩個腳本嗎?或者有沒有辦法使用單個 docker 命令一個接一個地運行?
- 如果我正在運行 python 腳本,我的 Dockerfile 應該是什么樣子
docker-compose.yml?
編輯:
理想情況下尋找基于docker-compose的解決方案
uj5u.com熱心網友回復:
在 Bourne shell 中,一般來說,您可以通過在它們之間放置來依次運行兩個命令&&。聽起來你已經意識到了這一點。
# without Docker, at a normal shell prompt
python test.py && python main.py
DockerfileCMD有兩種語法形式。JSON 陣列形式不運行 shell,因此它的效率略高,轉義規則也更一致。如果它不是 JSON 陣列,那么 Docker 會自動通過 shell 運行它。因此,您可以使用 shell 形式:
CMD python test.py && python main.py
在對其他答案的評論中,您詢問有關在docker-compose.yml檔案中將其提供為覆寫的問題。Compose 通常不會為您運行 shell,因此您需要將其明確指定為command:覆寫的一部分。
command: /bin/sh -c 'python test.py && python main.py'
您的 Dockerfile 通常應指定 aCMD并且docker-compose.yml通常不會包含command:. 這使得在其他背景關系中運行映像變得更加容易(通過docker run不使用 Compose;在 Kubernetes 中),因為您不必以想要運行容器的每種不同方式重新鍵入命令。@sytech 的答案中突出顯示的入口點包裝器模式通常非常有用,并且很容易添加到使用CMD不帶ENTRYPOINT;的容器中。但它需要 DockerfileCMD用作普通格式良好的 shell 命令。
uj5u.com熱心網友回復:
您必須更改CMD為ENTRYPOINT. 并在后臺使用&.
ENTRYPOINT ["/docker_entrypoint.sh"]
docker_entrypoint.sh
#!/bin/bash
set -e
exec python tests.py &
exec python main.py
uj5u.com熱心網友回復:
一般來說,一個很好的經驗法則是容器應該只有一個行程,并且基本行程應該是 pid 1
exec根據最佳實踐指南,使用入口點可以幫助您在運行時執行多項操作,并可選擇使用 運行用戶定義的命令。
例如,如果您總是希望在容器啟動時運行測驗,則在 CMD 中執行定義的命令。
首先,創建一個入口點腳本(確保使用 使其可執行chmod x):
#!/usr/bin/env bash
# always run tests first
python /src/tests.py
# then run user-defined command
exec "$@"
然后配置 dockerfile 復制腳本并將其設定為入口點:
#...
COPY entrypoint.sh /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["python", "main.py"]
然后當你從這個 dockerfile 構建一個鏡像并運行它時,入口點將首先執行測驗,然后運行命令來運行 main.py
用戶在運行映像時仍然可以覆寫該命令,docker run ... myimage <new command>這仍然會導致執行入口點測驗,但用戶可以更改正在運行的命令。
uj5u.com熱心網友回復:
您可以通過創建一個包含 python 命令的 bash 腳本(讓我們命名為 entrypoint.sh)來實作這一點。如果需要,您可以創建這些的后臺行程。
#!/usr/bin/env bash
set -e
python tests.py
python main.py
編輯您的 docker 檔案,如下所示:
FROM python:3.8-slim-buster
# Create workDir
RUN mkdir code
WORKDIR code
ENV PYTHONPATH = /code
#upgrade pip if you like here
COPY requirements.txt .
RUN pip install -r requirements.txt
# Copy Code
COPY . .
RUN chmod x entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
在 docker compose 檔案中,將以下行添加到服務中。
entrypoint: [ "./entrypoint.sh" ]
uj5u.com熱心網友回復:
你試過這個docker-compose.yaml嗎?
version: '3'
services:
main:
image: free
command: >
/bin/sh -c 'python3 tests.py & && python3 main.py &'
兩者都將在后臺運行
然后在終端運行
docker-compose up --build
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/460319.html
