我最近開始使用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
謝謝,請建議,如果你需要別人看到的東西設置!
這聽起來像是構建過程中的某個問題,但很難在不知道dockerfile和' docker-compose.yml'看起來像。如果你能向我們展示它們(也許在github回購或其他),它將幫助你理解你的困難。 –