如何通过 makefile 在 docker 镜像中运行命令

问题描述 投票:0回答:3

我有一个 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 并且什么都不做。我到底错过了什么?

python bash docker makefile
3个回答
1
投票

将命令作为输入传递给另一个命令(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
或其他任何方式运行它们。


0
投票

是的,我认为它行不通,就像当你想在 ssh 调用后运行一堆 linux 命令时,你需要传递一个脚本文件。 我认为最简单的方法是将所有命令放在 bash 文件中,然后用类似的东西调用 docker :

docker run -it python:3.8-buster /bin/bash -c script.sh

我没试过,可能是我输入的确切命令有语法错误。


0
投票

你在这里采取了一种相当有趣的方法。你应该考虑的是创建一个 Dockerfile 来构建你的图像,并将这些命令放入 dockerfile 本身。

© www.soinside.com 2019 - 2024. All rights reserved.