使用docker AND docker-compose构建的工作流程是什么?

时间:2018-07-19 08:13:44

标签: docker kubernetes docker-compose

我有this repodocker-compose up将启动项目,创建2个容器(一个数据库和API),并且一切正常。

现在,我想构建并部署到Kubernetes。我尝试docker-compose build,但它抱怨没有Dockerfile。因此,我开始编写Dockerfile,然后发现该docker/Dockerfiles don't support loading ENV vars from an env_file or .env file。是什么赋予了?我应该如何建立这个形象?有人可以启发我吗?

使用适当的环境变量构建docker映像的预期工作流程是什么?

2 个答案:

答案 0 :(得分:0)

这些环境变量不应在Docker构建步骤中设置,而应在Kubernetes或docker-compose上运行应用程序时设置。

所以:

编写一个Dockerfile并将其放置在根文件夹中。像这样:

FROM node
COPY package.json .
RUN npm install
COPY . .
ENTRYPOINT ["npm", "start"]

修改docker-compose.yaml。在图像字段中,您必须指定要生成的图像的名称。应该是这样的:

image: YOUR-DOCKERHUB-USERNAME/node-rest-auth-arangodb

无需设置userworking_dir

使用docker-compose build构建映像(您也可以使用docker build进行构建)

现在,您可以使用docker-compose up文件.env在本地运行您的应用了

要将其部署在Kubernetes上,您需要在dockerhub中发布映像(除非您在本地运行Kubernetes):

docker push YOUR-DOCKERHUB-USERNAME/node-rest-auth-arangodb

最后,创建一个Kubernetes清单。可悲的是,kubernetes不像docker-compose那样支持env文件,您需要在清单中手动设置以下变量:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: platform-api
  labels:
    app: platform-api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: platform-api
  template:
    metadata:
      labels:
        app: platform-api
    spec:
      containers:
      - name: platform-api
        image: YOUR-DOCKERHUB-USERNAME/node-rest-auth-arangodb
        ports:
        - containerPort: 8080
        env:
          - name: NODE_ENV
            value: develop

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: platform-db
  labels:
    app: platform-db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: platform-db
  template:
    metadata:
      labels:
        app: platform-db
    spec:
      containers:
      - name: arangodb
        image: YOUR-DOCKERHUB-USERNAME/node-rest-auth-arangodb
        ports:
        - containerPort: 8529
        env:
          - name: ARANGO_ROOT_PASSWORD
            value: localhost

使用kubectl create

进行部署

请注意,此代码仅供参考,我不完全知道您的用户情况。在docker-compose和kubernetes文档和教程中找到更多信息。祝你好运!

答案 1 :(得分:0)

我已经在github上更新了该项目,它现在可以正常工作,并且自述文件记录了如何运行它。

我意识到env var被视为运行时var,这就是--env-filedocker run而非docker build的选项的原因。 (我认为)这也就是为什么docker-compose.yml具有env_file选项的原因,我认为该选项只是将文件传递给docker build。在Kubernetes中,我认为这些是从configmap传入的。这样做是为了使图像保持更可移植;可以通过传入的不同var来运行同一项目,无需重新构建。

感谢ignacio-millán的输入。