多看官网是没错的。 https://docs.docker.com/engine/reference/builder/#usage

. 和 * 在dockerfile 中区别

目录结构

  1. [root@k8s-master model]# tree
  2. .
  3. ├── aa
  4. ├── _aaa.md
  5. └── bb
  6. └── cc
  7. └── dd
  8. └── ee
  9. └── _ee.md
  10. ├── Dockerfile
  11. ├── Dockerfile_cp_.
  12. ├── Dockerfile_cp_2
  13. ├── graph.pbtxt
  14. ├── instances_train.json
  15. ├── publish.log
  16. └── task_0
  17. └── mask_rcnn_weight_best.h5
  18. 6 directories, 9 files

. 是当前 整个目录(包含目录本身)

  1. [root@k8s-master model]# docker build -t docker_cp_test:cp_. -f Dockerfile_cp_. .
  2. Sending build context to Docker daemon 284MB
  3. Step 1/2 : FROM busybox:1.30
  4. 1.30: Pulling from library/busybox
  5. 53071b97a884: Pull complete
  6. Digest: sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3d
  7. Status: Downloaded newer image for busybox:1.30
  8. ---> 64f5d945efcc
  9. Step 2/2 : COPY . /home/test/model/
  10. ---> 3907e815300f
  11. Successfully built 3907e815300f
  12. Successfully tagged docker_cp_test:cp_.
  13. [root@k8s-master model]# docker run --rm -it docker_cp_test:cp_. ls /home/test/model
  14. Dockerfile aa publish.log
  15. Dockerfile_cp_. graph.pbtxt task_0
  16. Dockerfile_cp_2 instances_train.json

COPY * 是目录下所有 (不包含目录本身)

https://docs.docker.com/engine/reference/builder/#copy
Ifis a directory, the entire contents of the directory are copied, including filesystem metadata.
The directory itself is not copied, just its contents.

但是看到 有 ls /home/test/model/bb/cc/dd/ee/_ee.md,这个 还是没问题的。 A context is processed recursively.
多看官网是没错的。

  1. [root@k8s-master model]# cat Dockerfile_cp_2
  2. FROM busybox:1.30
  3. COPY * /home/test/model/
  4. [root@k8s-master model]# docker build -t docker_cp_test:cp_2 -f Dockerfile_cp_2 .
  5. Sending build context to Docker daemon 284MB
  6. Step 1/2 : FROM busybox:1.30
  7. ---> 64f5d945efcc
  8. Step 2/2 : COPY * /home/test/model/
  9. ---> e6910b62dab3
  10. Successfully built e6910b62dab3
  11. Successfully tagged docker_cp_test:cp_2
  12. [root@k8s-master model]# docker run --rm -it docker_cp_test:cp_2 ls /home/test/model
  13. Dockerfile _aaa.md instances_train.json
  14. Dockerfile_cp_. bb mask_rcnn_weight_best.h5
  15. Dockerfile_cp_2 graph.pbtxt publish.log
  16. [root@k8s-master model]# docker run --rm -it docker_cp_test:cp_2 ls /home/test/model/bb/cc/dd/ee/_ee.md
  17. /home/test/model/bb/cc/dd/ee/_ee.md

dockerfile RUN 的 命令中 有 “”

To use a different shell, other than ‘/bin/sh’, use the_exec_form passing in the desired shell. For example:
RUN ["/bin/bash", "-c", "echo hello"]

Note
The_exec_form is parsed as a JSON array, which means that you must use double-quotes (“) around words not single-quotes (‘).

比如 我想执行

  1. sed -i "/format/a \ '\/transfer_learning'," test_factory.py
  2. sed -i "/format/d" test_factory.py

所以我就在 dockerfile 里写

  1. FROM {{ base_image }}
  2. RUN ["/bin/bash", "-c", "sed -i \"/format/a \\ '\/trained_model_services',\" /opt/letrain-run-script/deploy_service/test_factory.py "]
  3. RUN ["/bin/bash", "-c", "sed -i \"/format/d\" /opt/letrain-run-script/deploy_service/test_factory.py "]
  4. COPY . {{ model_copy_dest }}
  5. ENTRYPOINT ["python", "/opt/letrain-run-script/deploy_service/deploy_service.py",\
  6. "--scenario={{ tarined_model_scenario }}",\
  7. "--deploy_path={{ tarined_model_location }}", "--port=80",\
  8. "--model_name={{ tarined_model_name }}"]
  9. ENV PATH=$PATH":/usr/local/cuda/bin"
  10. ENV LETRAIN_PATH="/opt/letrain"
  11. ENV export LETRAIN_PATH

before

  1. from resoure import DeployServiceRunner
  2. def create_app():
  3. import falcon
  4. import os
  5. api = falcon.API()
  6. scenario = os.environ.get('LETRAIN_SCENARIO', '')
  7. model_path = os.environ.get('LETRAIN_MODEL_PATH', '')
  8. model_name = os.environ.get('LETRAIN_MODEL_NAME', '')
  9. service_uuid = os.environ.get('SERVICE_UUID', '')
  10. api.add_route(
  11. '/internal_api/service/{0}'.format(service_uuid),
  12. DeployServiceRunner(scenario, model_path, model_name)
  13. )
  14. return api

after

  1. from resoure import DeployServiceRunner
  2. def create_app():
  3. import falcon
  4. import os
  5. api = falcon.API()
  6. scenario = os.environ.get('LETRAIN_SCENARIO', '')
  7. model_path = os.environ.get('LETRAIN_MODEL_PATH', '')
  8. model_name = os.environ.get('LETRAIN_MODEL_NAME', '')
  9. service_uuid = os.environ.get('SERVICE_UUID', '')
  10. api.add_route(
  11. '/transfer_learning',
  12. DeployServiceRunner(scenario, model_path, model_name)
  13. )
  14. return api