2016-11-15 45 views
1

我最近開始使用docker。看起來非常令人興奮,事實上你可以構建應用程序並在任何機器上運行應用程序,聽起來令人驚歎!運行在EC2上的R(搖桿/ r.base)和python的Docker鏡像不起作用,但本地很好

事實是,我經歷了別的事情。我有一個R圖像作爲基礎(搖桿/ r.base),我想安裝python,所以我可以在圖像上運行一個應用程序,它會暴露曾經調用過的端點,它會運行一個R腳本,記錄一些結果。

整個事情是一個碼頭構成文件的一部分(在構圖上還有3-4個圖像,都做了單獨的操作)。

因此,我設法構建圖像並使用docker-compose在本地運行它。

當我嘗試將映像部署到AWS EC2實例時,會出現奇怪的事情。到目前爲止,我已經設法在AWS上運行其他圖像。但是對於這個特定的圖像,由於我得到了一些庫依賴性錯誤,構建失敗,並且在解決這個問題之後,執行失敗。要進入更多的一些細節:

  • 起初,我在AWS上越來越依賴錯誤,而建設(當地沒有這樣的錯誤)。所以,爲了克服這個問題,我修改了我的Dockerfile,以便單獨安裝這些依賴關係。這工作!我的圖像終於建成了。但然後:
  • 我設法讓Web應用程序暴露給端點。然後我嘗試調用R腳本,並且得到系統找不到Rscript命令(我明確地將其定義爲/ usr/bin/Rscript,在本地工作正常 - 我使用python的subprocess.call來運行R腳本) 。

因此,似乎Rscript沒有安裝在我的AWS容器上!這可能是因爲我使用的手動安裝,我已經使用了 - allow-downgrades,因此將安裝正確的版本。我懷疑這些降級可能會刪除一些圖書館?

無論如何,我真的不知道什麼是錯的。這對我來說聽起來很糟糕。我認爲一旦你在本地運行某個東西,那麼你可以在任何地方用docker運行它,但似乎不是這種情況,或者我錯過了一些非常糟糕的事情。我的本地生產(AWS)服務器使用相同版本的docker(1.12.3,build 6b644ec)和docker-compose(版本1.7.0,build 0d7bf73),並且我已經爲這兩臺機器啓用了i386架構以防萬一這是問題,兩者實際上都使用amd64)。

不知道我是否期望從這篇文章中得到一些答案,到目前爲止我還沒有發現類似的情況,但如果有人遇到過這種情況,請自由發言! :)

乾杯, 的Babis

UPDATE

你是絕對正確亞龍。我附上一些更多信息。首先,搬運工,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 <[email protected]> 

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 

謝謝,請建議,如果你需要別人看到的東西設置!

+1

這聽起來像是構建過程中的某個問題,但很難在不知道dockerfile和' docker-compose.yml'看起來像。如果你能向我們展示它們(也許在github回購或其他),它將幫助你理解你的困難。 –

回答

1

原因是r.base與一些python軟件包有衝突,無法在此R圖像中使用python。

我最終得到了一個docker-inside-docker鏡像的解決方案,它以ubuntu爲基礎。我在ubuntu鏡像中安裝了所需的python庫,在其上安裝了docker,並在這個鏡像中使用docker構建了這個r.base鏡像。然後,我使用docker run從Ubuntu容器中運行,並設法執行我的工作:)

相關問題