2016-07-18 27 views
6

Chúng tôi có ứng dụng AngularJS. Chúng tôi đã viết một dockerfile cho nó để nó có thể tái sử dụng trên mọi hệ thống. Dockerfile không phải là một thực hành tốt nhất và nó có thể là một số xây dựng lạ (xây dựng và lưu trữ trong cùng một tập tin) cho một số nhưng nó chỉ được tạo ra để chạy ứng dụng angularjs của chúng tôi tại địa phương trên mỗi PC của mỗi nhà phát triển.Hình ảnh docker có thể tái sử dụng cho AngularJS

Dockerfile: 
FROM nginx:1.10 

... Steps to install nodejs-legacy + npm 

RUN npm install -g gulp 
RUN npm install 
RUN gulp build 

.. steps to move dist folder 

Chúng tôi xây dựng hình ảnh của chúng tôi với docker build -t myapp:latest . Mỗi nhà phát triển có thể chạy ứng dụng của chúng tôi với docker run -d -p 80:80 myapp:latest

Nhưng bây giờ chúng tôi đang phát triển backends khác. Vì vậy, chúng tôi có một hậu phương trong DEV, một hậu phương trong UAT, ... Vì vậy, có URL khác nhau mà chúng ta cần phải sử dụng trong /config/xx.json

{ 
    ... 
    "service_base": "https://backend.test.xxx/", 
    ... 
} 

Chúng tôi không muốn thay đổi URL mà mọi thời gian, xây dựng lại hình ảnh và bắt đầu nó. Chúng tôi cũng không muốn khai báo một số URL (dev, uat, prod, ..) có thể được sử dụng ở đó. Chúng tôi muốn thực hiện quy trình gulp build của chúng tôi với biến môi trường thay vì URL được mã hóa cứng.

Vì vậy, chúng ta có thể bắt đầu container của chúng tôi như thế này:

docker run -d -p 80:80 --env URL=https://mybackendurl.com app:latest 

Có ai có kinh nghiệm với loại này của vấn đề? Vì vậy, chúng tôi sẽ cần một biến env trong json của chúng tôi và xây dựng nó và thêm URL sau này nếu có thể.

Trả lời

1

EDIT: Tùy chọn tốt hơn là sử dụng build args

Thay vì truyền URL tại lệnh docker run, bạn có thể sử dụng docker build args. Nó là tốt hơn để có xây dựng các lệnh liên quan được thực hiện trong quá trình xây dựng docker hơn docker chạy.

Trong Dockerfile của bạn,

ARG URL 

Và sau đó chạy

docker build --build-arg URL=<my-url> . 

Xem stackoverflow question này để biết chi tiết

+0

Sau đó, tôi có lẽ cũng cần phải thực hiện việc xây dựng gulp trong đó .sh + tất cả các bước sau khi nó – lvthillo

+0

Tôi không nghĩ đó là ý tưởng hay. entrypoint.sh sẽ thực thi trong lệnh docker run và không phải docker build. Bạn có thể cần một giải pháp khác nếu bạn muốn chạy gulp như một phần của docker build. – atv

+0

Việc sử dụng lệnh docker run trong trường hợp này là tốt. Nếu không, tôi sẽ không thể cung cấp một ENV VAR cho container của tôi (và để thực hiện một gulp xây dựng trên nó) – lvthillo

0

Đây là 'giải pháp' của tôi. Tôi biết nó không phải là cách tiếp cận docker tốt nhất nhưng chỉ cho các nhà phát triển của chúng tôi đó là một trợ giúp lớn.

dockerfile của tôi trông như thế này:

FROM nginx:1.10 

RUN apt-get update && \ 
apt-get install -y curl 

RUN sed -i "s/httpredir.debian.org/`curl -s -D - http://httpredir.debian.org/demo/debian/ | awk '/^Link:/ { print $2 }' | sed -e '[email protected]<http://\(.*\)/debian/>;@\[email protected]'`/" /etc/apt/sources.list 

RUN \ 
    apt-get clean && \ 
    apt-get update && \ 
    apt-get install -y nodejs-legacy && \ 
    apt-get install -y npm 

WORKDIR /home/app 
COPY . /home/app 

RUN npm install -g gulp 
RUN npm install 

COPY start.sh/
CMD ["./start.sh"] 

Vì vậy, sau khi toàn bộ bao gồm các ứng dụng + NPM cài đặt bên trong nginx của tôi, tôi bắt đầu container của tôi với kịch bản start.sh.

Nội dung của start.sh:

#!/bin/bash 
sed -i '[email protected]@'"$DATA_ACCESS_URL"'@' configs/config.json 
gulp build 
rm -r /usr/share/nginx/html/ 
//cp right folders which are created by gulp build to /usr/share/nginx/html 
... 
//start nginx container 
/usr/sbin/nginx -g "daemon off;" 

Vì vậy, việc xây dựng sẽ xảy ra khi bắt đầu container của tôi. Không phải là cách tốt nhất tất nhiên nhưng đó là tất cả cho nhu cầu của các nhà phát triển. Có lối vào dễ dàng tại địa phương.

Lệnh sed sẽ thực hiện một thay thế vào file cấu hình, trong đó có cái gì đó như:

{ 
    "service_base": "my-url", 
} 

Vì vậy, my-url sẽ được thay thế bằng nội dung của tôi về biến môi trường của tôi mà tôi Willd xác định trong lệnh docker run của tôi .

Tôi có thể thực hiện được.

docker run -d -p 80:80 -e DATA_ACCESS_URL=https://mybackendurl.com app:latest 

Và mọi nhà phát triển đều có thể sử dụng giao diện người dùng cục bộ và kết nối với URL phụ trợ của chính họ.

Các vấn đề liên quan