首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更优雅的docker run命令

更优雅的docker run命令
EN

Stack Overflow用户
提问于 2020-12-16 03:11:47
回答 1查看 60关注 0票数 1

我已经使用Dockerfile构建了一个docker镜像,它执行以下操作:

代码语言:javascript
复制
FROM my-base-python-image
WORKDIR /opt/data/projects/project/
RUN mkdir files
RUN rm -rf /etc/yum.repos.d/*.repo
COPY rss-centos-7-config.repo /etc/yum.repos.d/
COPY files/ files/
RUN python -m venv /opt/venv && . /opt/venv/activate
RUN yum install -y unzip
WORKDIR files/
RUN unzip file.zip && rm -rf file.zip && . /opt/venv/bin/activate && python -m pip install *
WORKDIR /opt/data/projects/project/

这将构建一个允许我运行自定义命令的映像。例如,在终端中,以下是我在激活项目venv后运行的命令:

代码语言:javascript
复制
python -m pathA.ModuleB -a inputfile_a.json -b inputfile_b.json -c

参数a&b是用于标识输入文件的自定义标记。-c调用一段代码。

因此,为了成功运行构建的镜像,我运行容器并将本地文件映射到输入文件:

代码语言:javascript
复制
docker run --rm -it -v /local/inputfile_a.json:/opt/data/projects/project/inputfile_a.json -v /local/inputfile_b.json:/opt/data/projects/project/inputfile_b.json image-name:latest bash -c 'source /opt/venv/bin/activate  && python -m pathA.ModuleB -a inputfile_a.json -b inputfile_b.json -c'

除了缩短文件路径之外,我还能做些什么来缩短docker run命令?我认为在Dockerfile中添加一个CMD和/或入口点会有所帮助,但是我不知道该怎么做,因为我得到了错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-16 03:33:53

你可以做几件事来改善这一点。

最简单的方法是在Docker之外运行应用程序。您提到您有一个可以工作的Python虚拟环境。Docker的一个设计目标是,容器中的程序通常不能访问主机上的文件,因此,如果您的应用程序都是关于读写主机文件的,Docker可能不是一个很好的选择。

容器中的文件路径相当长,这会使-v挂载选项变得臃肿。您不需要/opt/data/projects/project前缀;通常只使用/app/data这样的短路径。

您还将应用程序安装到Python虚拟环境中,但是安装在Docker镜像中,Docker镜像提供了自己的隔离性。正如您在docker run命令和其他地方看到的那样,在Docker中激活虚拟环境的机制有点繁琐。这也不是必需的;只需完全跳过虚拟环境设置。(您也可以直接运行/opt/venv/bin/python,它知道它“属于”一个虚拟环境,而不需要显式激活它。)

最后,在setup.py文件中,可以使用setuptools entry_points声明来提供运行指定模块的脚本。

这可以将Dockerfile减少到或多或少

代码语言:javascript
复制
FROM my-base-python-image
# OS-level setup
RUN rm -rf /etc/yum.repos.d/*.repo
COPY rss-centos-7-config.repo /etc/yum.repos.d/
RUN yum install -y unzip
# Copy the application in
WORKDIR /app/files
COPY files/ ./
RUN unzip file.zip \
 && rm file.zip \
 && pip install *
# Typical runtime metadata
WORKDIR /app
CMD main-script --help

然后当你运行它时,你可以:

代码语言:javascript
复制
docker run --rm -it \
  -v /local:/data   \  # just map the entire directory
  image-name:latest \
  main-script -a /data/inputfile_a.json -b /data/inputfile_b.json -c

您还可以考虑使用docker run -w /data选项来更改当前目录,这将添加Docker级别的参数,但会稍微缩短脚本命令行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65312249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档