我最近开始使用docker。看起来非常令人兴奋,您可以在任何机器上构建应用程序并运行它们,这听起来很棒!
事实是我经历过其他事情。我有一个R图像作为基础(摇杆/ r.base),我想安装python,所以我可以在图像上运行一个烧瓶应用程序,它将公开一个被调用的端点,它将运行一个R脚本和记录一些结果。
整个东西是docker-compose文件的一部分(在compose上还有3-4个图像,所有这些都是单独的操作)。
所以我设法构建图像并使用docker-compose在本地运行它。
当我尝试将映像部署到AWS EC2实例时,会出现奇怪的事情。到目前为止,我已经设法在AWS上运行其他图像。但是对于这个特定的图像,构建失败是因为我得到了一些库依赖性错误,并且在修复之后,执行失败了。要了解更多细节:
所以似乎我的容器上没有安装Rscript在AWS!这可能是因为我所做的手动安装,我使用过 - allow-downgrades
所以将安装正确的版本。我怀疑这些降级可能会删除一些库吗?
无论如何,我无法弄清楚出了什么问题。这对我来说听起来很糟糕。我认为一旦你在本地运行一些东西,那么你可以用docker在任何地方运行它,但似乎不是这种情况,或者我错过了一些非常糟糕的东西。
BTW,我的本地生产(AWS)服务器使用相同版本的docker(1.12.3,build 6b644ec)和docker-compose(版本1.7.0,build 0d7bf73),我已经为这两台机器启用了i386架构(只是如果这是问题,两者实际上都在使用amd64)。不确定我是否期望从这篇文章得到一些答案,到目前为止我在google搜索时没有找到类似的情况,但如果有人之前遇到过这种情况,请自由发言! :)
干杯, 的Babis
更新:
你绝对是对的Yaron。我附上一些更多的信息。首先,docker-compose.yml:
version: '2'
services:
recommend.service: # This service is fine both locally and on AWS
build:
context: .
dockerfile: ./docker/recommend.service.Dockerfile
ports:
- "8081:8081"
restart: always
env_file: .env
cltv.service: # This is the service that has problems to be built and run on AWS. Locally is fine
build:
context: .
dockerfile: ./docker/cltv.service.Dockerfile
ports:
- "8082:8082"
restart: always
env_file: .env
rabbit: # Works everywhere
image: rabbitmq
hostname: smart.rabbitmq
restart: always
volumes:
- rabbit.data:/var/lib/rabbitmq
celery: # Works everywhere
build:
context: .
dockerfile: ./docker/smart.celery.Dockerfile
depends_on:
- rabbit
restart: always
env_file: .env
volumes:
rabbit.data:
driver: local
和./docker/cltv.service.Dockerfile:
## Adapted from zamora/r-devtools
## Start with the official rocker image (lightweight Debian)
FROM rocker/r-base:latest
MAINTAINER Babis <cparavalos@gmail.com>
ENV DEBIAN_FRONTEND noninteractive
RUN mkdir -p /usr/src/cltv_app
WORKDIR /usr/src/cltv_app
COPY requirements.txt /usr/src/cltv_app/requirements.txt
COPY requirements-cltv.txt /usr/src/cltv_app/requirements-cltv.txt
COPY cltv/ /usr/src/cltv_app/cltv/
COPY services/ /usr/src/cltv_app/services/
# Install external dependencies
RUN apt-get update -qq \
&& apt-get install -y --no-install-recommends --allow-downgrades \
libcurl3=7.50.1-1 \ # I added that because of dependencies issue while building in the server. Locally I didn't need it
libcurl4-openssl-dev \
libssl-dev \
libsqlite3-dev \
libxml2-dev \
qpdf \
vim \
libgsl-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/ \
&& rm -rf /tmp/downloaded_packages/ /tmp/*.rds
# Install devtools and testthat
RUN install2.r --error \
devtools \
testthat \
gsl
# Install some required libraries
RUN Rscript -e 'devtools::install_github("mplatzer/BTYDplus", dependencies=TRUE)'
## Note: I had added the below in order to get a succesful build because of the dependencies errors. In my local, the image is built and run without these!!!
#RUN apt-get update
#RUN apt-get install -y --allow-downgrades libkrb5support0=1.14.3+dfsg-2
#RUN apt-get install -y libkrb5-3=1.14.3+dfsg-2
#RUN apt-get install -y libk5crypto3=1.14.3+dfsg-2
#RUN apt-get install -y libgssapi-krb5-2=1.14.3+dfsg-2
#RUN apt-get update
#RUN apt-get install -y krb5-multidev
# Install python and postgres required packages
RUN apt-get update
RUN apt-get install -y python3.4 python3-dev libpq-dev python-pip
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install --no-cache-dir -r requirements-cltv.txt
RUN pip install -e cltv/.
EXPOSE 8082
# Set a big timeout
CMD ["/usr/local/bin/gunicorn", "--log-config", "cltv/logging.conf", "cltv.wsgi:app", "--bind", "0.0.0.0:8082", "--timeout", "86400"]
我用以下方式触发整个过程:
docker-compose up --build -d
谢谢,如果你需要在设置上看到别的东西,请建议!
答案 0 :(得分:1)
原因是r.base与某些python包有冲突,并且无法将python与此R图像一起使用。
我最终得到了一个docker-dock-docker图像的解决方案,它以ubuntu为基础。我在ubuntu映像中安装了所需的python库,在它上面安装了docker,在这个映像中我使用docker来构建这个r.base映像。然后我在ubuntu容器内部使用了docker run,并设法完成我的工作:)