使用docker文件执行shell脚本
我有一些tar文件,我想移动到泊坞窗图像,并在那里提取它们,然后运行python web应用程序脚本。 我有sh脚本来提取这些文件。
如果我使用RUN命令运行脚本,则它们会被解压缩,但它们不会出现在最终的容器中。
我也使用入口点,但它执行,然后closures容器不执行“主要Python脚本”。
有没有办法如何执行这个安装脚本,然后继续运行主脚本,而不是closures?
Dockerfile
# Use an official Python runtime as a parent image FROM python:2.7-slim RUN apt-get update \ && apt-get install -y curl \ && curl -sL https://deb.nodesource.com/setup_4.x | bash \ && apt-get install -y nodejs \ && apt-get install -y git \ && npm install -g bower \ && npm install -g gulp@^3.9.1 # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app RUN pip install -r requirements.txt \ && npm install \ && bower install --allow-root \ && gulp default # Define environment variable ENV PATH "$PATH:/app/tree-tagger/cmd/" ENV PATH "$PATH:/app/tree-tagger/bin/" ENV TREETAGGER "/app/tree-tagger/cmd/" ENV TREETAGGER_HOME "/app/tree-tagger/cmd/" CMD python app.py ENTRYPOINT sh tree-tagger/install-tagger.sh
这里是docker-compose脚本
web: build: . ports: - "8080:8080" volumes: - .:/app links: - db db: image: mongo:3.0.2
你可以使用RUN。 RUN在容器端运行,所以任何由它创build的新东西都将包含在容器中。
您的问题很可能来自您的docker-compose文件正在装入您以前写入的卷。 基本上,你要做的是:1.在容器创build过程中,将当前目录复制到/ app,并用它做一些事情2.创build容器后 – 在将当前目录再次安装到/ app时运行它。
所以你最终在/ app /中新创build的东西被覆盖。 如果您跳过docker-compose中的音量部分,它将全部按预期工作。 但是,如果您更喜欢将当前的应用程序代码安装到/应用程序(所以您不必在每次代码更改时重新开发图像),都有一种方法。 把你的docker改成:
web: build: . ports: - "8080:8080" volumes: - .:/app - /app/tree-tagger/ links: - db db: image: mongo:3.0.2
现在,您可以将dockerfile更改为之前的版本(使用RUN而不是ENTRYPOINT),并且/ app / tree-tagger /这次不会被replace。 所以:
... RUN sh tree-tagger/install-tagger.sh CMD python app.py
- 我可以使用Putty从Rancher Stack中获取URL。 如何使用Jenkins中的shell命令从Rancher Stack中获取相同的URL
- docker-machine中的Eval:terminal vs shell脚本
- 应该使用临时docker容器删除一个卷?
- 为什么在docker-machine虚拟机中创build一个文件会导致权限被拒绝?
- 我怎样才能运行一个泊坞窗图像的新容器bash?
- 使用envvariablesprepend命令 – 包括子命令
- Kubernetes – kubectl exec bash – 会话下拉和线宽
- 在内联运行命令中访问容器环境variables
- 如何检查我的本地泊坞窗图像是否过时,而不从其他地方推送?