我有一个 Python 项目,现在我正在尝试创建一个
Makefile
,它应该运行特定命令,例如 apt-get
,并访问传递给 make 命令的变量值作为参数。下面是我的Makefile
代码:
VENV = venvs
PYTHON = $(VENV)/bin/python3
PIP = $(VENV)/bin/pip
run : $(VENV)/bin/activate
$(PYTHON) jobs/first_file.py
$(VENV)/bin/activate:
docker run -it python:3.8-buster /bin/bash
python3 -m venv $(VENV)
$(PIP) install --upgrade pip
$(PIP) install -r requirements.txt
clean :
rm -rf __pycache__
rm -rf $(VENV)
现在,我的意图是调用 docker 镜像并运行
pip commands
以及稍后对该 docker 镜像的所有进一步命令。它还包括连接到一个 AWS 账户,其值将作为参数传递到 make 命令中。
但是当我在项目的根目录下运行 make 时。它只是连接到 docker bash 并且什么都不做。我到底错过了什么?
将命令作为输入传递给另一个命令(su、ssh、sh 等) 解释了语法的基本问题。其他命令将在
bash
退出后运行。一个最小的修复看起来像
$(VENV)/bin/activate:
docker run -it python:3.8-buster /bin/bash '\
python3 -m venv $(VENV); \
$(PIP) install --upgrade pip; \
$(PIP) install -r requirements.txt'
但是,您还需要了解
docker run
创建一个新的容器,运行命令,然后退出conthiner。之后您的所有更改都将丢失。
如果我能正确猜出你的意图,这些命令应该简单地放在你的
Dockerfile
中。这将创建一个图像 with 这些变化,然后你可以 docker run
任意多次。
或者,在容器内创建脚本(或者
Makefile
,如果你喜欢的话),用 docker run
启动它一次(确保它的起点 CMD
是一个命令或脚本,它会永远运行,或者直到你单独告诉它关闭)并用docker exec containername make foo
或其他任何方式运行它们。
是的,我认为它行不通,就像当你想在 ssh 调用后运行一堆 linux 命令时,你需要传递一个脚本文件。 我认为最简单的方法是将所有命令放在 bash 文件中,然后用类似的东西调用 docker :
docker run -it python:3.8-buster /bin/bash -c script.sh
我没试过,可能是我输入的确切命令有语法错误。
你在这里采取了一种相当有趣的方法。你应该考虑的是创建一个 Dockerfile 来构建你的图像,并将这些命令放入 dockerfile 本身。