运行Python脚本以启动Docker contatiner并在Docker容器内执行代码

xtfmy6hx  于 2023-04-28  发布在  Python
关注(0)|答案(1)|浏览(163)

目前,我有两个python脚本,一个启动docker容器,另一个启动后在容器内运行。我想把它做成一个单独的文件,它将启动容器,然后在容器中执行其余的代码。这可能吗?如果可能,如何做到?
我试过docker python库,并在容器启动后通过ssh连接到容器,但如果不使用这两个脚本,似乎什么都不起作用。
提前感谢任何帮助。

9jyewag0

9jyewag01#

从你的问题中,你希望有创建docker容器的代码,然后在同一个文件中有只在docker容器内执行的代码。
使用以下设置即可实现:

  • dockerfile
FROM python:3.8-slim-buster

  WORKDIR /src

  COPY requirements.txt requirements.txt
  RUN pip install --no-cache-dir -r requirements.txt

  COPY . .

  ENV AM_I_IN_A_DOCKER_CONTAINER=True
  CMD [ "python", "-m" , "main"]
  • main.py
import os
  import subprocess

  if __name__ == '__main__':
      # https://stackoverflow.com/questions/43878953/how-does-one-detect-if-one-is-running-within-a-docker-container-within-python
      SECRET_KEY = os.environ.get('AM_I_IN_A_DOCKER_CONTAINER', False)

      if not SECRET_KEY:
          print(f"Code running to create container.")

          process = subprocess.Popen(["docker", "build", "--tag", "stackoverflow-question", "."])
          process.wait(timeout=60)
          process.terminate()
          print(f"Created image: 'stackoverflow-example'")

          process = subprocess.Popen(["docker", "run", "--publish", "5000:5000", "stackoverflow-question"])
          process.wait(timeout=60)
          print(f"Created container: 'stackoverflow-example'")
          print(f"Terminating primary script.")
          exit()

      import numpy as np

      print(f"\nWelcome inside the container.")
      print(f"This will be running inside the container only.")
      print(np.random.randint(1, 255, 10))
  • requirements
numpy

流程

该方法分两步进行。
首先,我们需要执行代码来创建docker镜像并启动容器。上面的代码使用subprocess创建一个新的映像,其中包含main.pyrequirements.txt文件。然后在容器中,我们还指定它应该运行main.py文件。
其次,我们必须区分在容器内部和外部运行的是来自main.py的哪些代码。这是通过使用来自凯尔Truong(43878953)的帖子来完成的,该帖子是变量AM_I_IN_A_DOCKER_CONTAINER。现在,我们可以将main.py文件拆分为一个部分,以便在容器之前和容器之后运行。

旁注

这段代码将在 * 每次运行 * 时启动一个新的docker容器,所以请确保关闭它们。

相关问题