使用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