[docker] COPY とADD の違いを試してみた２

本記事は、[Docker2 Advent Calendar 2016](http://qiita.com/advent-
calendar/2016/docker2) の19日目の記事になります。

# 概要
以前、[COPY とADD の違いを試してみた](http://qiita.com/hihihiroro/items/0956326d6731bc927166) という記事を書いたがそれの残タスクがあったのでそれを試してみる。
※ version が以前とはだいぶ違うが
以前のも動くことは後ほど検証 or 以前の記事をversion をあげて書き直す

# 検証内容
コピー元をURL 指定、ワイルドカード指定

# 環境
* OS : cent7.3

```bash
cat /etc/redhat-release
  # CentOS Linux release 7.3.1611 (Core)
```

* docker : 1.10.3

```bash
[root@docker-engine centos]# docker version
  # Client:
  #  Version:         1.10.3
  #  API version:     1.22
  #  Package version: docker-common-1.10.3-59.el7.centos.x86_64
  #  Go version:      go1.6.3
  #  Git commit:      3999ccb-unsupported
  #  Built:           Thu Dec 15 17:24:43 2016
  #  OS/Arch:         linux/amd64
  # 
  # Server:
  #  Version:         1.10.3
  #  API version:     1.22
  #  Package version: docker-common-1.10.3-59.el7.centos.x86_64
  #  Go version:      go1.6.3
  #  Git commit:      3999ccb-unsupported
  #  Built:           Thu Dec 15 17:24:43 2016
  #  OS/Arch:         linux/amd64
```
※ install は[こちら](https://docs.docker.com/installation/centos/)を参照

# ファイル構成

```bash
[root@docker-engine work]# tree /tmp/work/
  # /tmp/work/
  # ├── fuga-dir
  # │   ├── fuga-file
  # │   └── fuga.tar
  # ├── funga
  # └── hoge-dir
  #     ├── hoge-file
  #     └── hoge.zip
  # 
  # 2 directories, 5 files

[root@docker-engine work]# ls -Rl /tmp/work/
  # /tmp/work/:
  # total 12
  # drwxr-xr-x 2 root root 4096 Dec 19 17:26 fuga-dir
  # -rw-r--r-- 1 root root    6 Dec 19 17:27 funga
  # drwxr-xr-x 2 root root 4096 Dec 19 17:27 hoge-dir
  # 
  # /tmp/work/fuga-dir:
  # total 16
  # -rw-r--r-- 1 root root     9 Dec 19 17:25 fuga-file
  # -rw-r--r-- 1 root root 10240 Dec 19 17:25 fuga.tar
  # 
  # /tmp/work/hoge-dir:
  # total 8
  # -rw-r--r-- 1 root root   9 Dec 19 17:26 hoge-file
  # -rw-r--r-- 1 root root 164 Dec 19 17:27 hoge.zip
```

# test1 : URL を指定してCOPY
``` bash:Dockerfile
FROM centos:7
MAINTAINER hihihiroro

RUN mkdir /tmp/work

COPY http://example.com/index.html /tmp/work/example.html
```
build

```bash
[root@docker-engine work]# cd /tmp/work/
[root@docker-engine work]# docker build -t copy-url .
  # Sending build context to Docker daemon 17.92 kB
  # Step 1 : FROM centos:7
  #  ---> 67591570dd29
  # Step 2 : MAINTAINER hihihiroro
  #  ---> Running in 1baa509382b6
  #  ---> ec1a2737296f
  # Removing intermediate container 1baa509382b6
  # Step 3 : RUN mkdir /tmp/work
  #  ---> Running in 52a56ea88420
  #  ---> 412a7e8f4fb5
  # Removing intermediate container 52a56ea88420
  # Step 4 : COPY http://example.com/index.html /tmp/work/example.html
  # Source can't be a URL for COPY
```

## 結果確認 : test1
```bash
Source can't be a URL for COPY
```
COPY ではURL をSource に使えないのでimage のbuild に失敗した。

# test2 : URL を指定してADD
``` bash:Dockerfile
FROM centos:7
MAINTAINER hihihiroro

RUN mkdir /tmp/work

ADD http://example.com/index.html /tmp/work/example.html
```
build

```bash
[root@docker-engine work]# cd /tmp/work/
[root@docker-engine work]# docker build -t add-url .
  # Sending build context to Docker daemon 17.92 kB
  # Step 1 : FROM centos:7
  #  ---> 67591570dd29
  # Step 2 : MAINTAINER hihihiroro
  #  ---> Running in 31f2758088ce
  #  ---> c6415c5c5827
  # Removing intermediate container 31f2758088ce
  # Step 3 : RUN mkdir /tmp/work
  #  ---> Running in ef4b04f5016c
  #  ---> 8d58fed49187
  # Removing intermediate container ef4b04f5016c
  # Step 4 : ADD http://example.com/index.html /tmp/work/example.html
  # Downloading  1.27 kB
  # 
  #  ---> 8b697cfa387c
  # Removing intermediate container c4551b9e2f16
  # Successfully built 8b697cfa387c
```

## 結果確認 : test2
```bash
[root@docker-engine work]# docker run --rm -it add-url /bin/bash
[root@8ed50e3289c6 /]# tree /tmp/work
  # /tmp/work
  # `-- example.html
  # 
  # 0 directories, 1 file
[root@8ed50e3289c6 /]# ls -Rl /tmp/work/
  # /tmp/work/:
  # total 4
  # -rw------- 1 root root 1270 Aug  9  2013 example.html

```
URL 先からFile を取得してきて、指定したフォルダにファイルを置いてくれている。

# test3 : ワイルドカード指定でCOPY
```bash:Dockerfile
FROM centos:7
MAINTAINER hihihiroro

RUN mkdir /tmp/work

COPY fu* /tmp/work/
```
build

```bash
[root@docker-engine work]# cd /tmp/work/
[root@docker-engine work]# docker build -t wild-copy .
  # Sending build context to Docker daemon 17.92 kB
  # Step 1 : FROM centos:7
  #  ---> 67591570dd29
  # Step 2 : MAINTAINER hihihiroro
  #  ---> Running in 2a50eca80fa3
  #  ---> 134a3911d9ba
  # Removing intermediate container 2a50eca80fa3
  # Step 3 : RUN mkdir /tmp/work
  #  ---> Running in 3667ceea90ec
  #  ---> bd93f183a910
  # Removing intermediate container 3667ceea90ec
  # Step 4 : COPY fu* /tmp/work/
  #  ---> ab013b9f30ff
  # Removing intermediate container 5baf64af9ae5
  # Successfully built ab013b9f30ff
```

## 結果確認 : test3
```bash
[root@docker-engine work]# docker run -it --rm wild-copy /bin/bash
[root@b417c938d0ea /]# tree /tmp/work
  # /tmp/work
  # |-- fuga-file
  # |-- fuga.tar
  # `-- funga
  # 
  # 0 directories, 3 files
[root@b417c938d0ea /]# ls -Rl /tmp/work/
  # /tmp/work/:
  # total 20
  # -rw-r--r-- 1 root root     9 Dec 19 08:25 fuga-file
  # -rw-r--r-- 1 root root 10240 Dec 19 08:25 fuga.tar
  # -rw-r--r-- 1 root root     6 Dec 19 08:27 funga
```
`fu` から始まるファイルがコピーされていることを確認できた。


# test4 : ワイルドカード指定でADD
```bash:Dockerfile
FROM centos:7
MAINTAINER hihihiroro

RUN mkdir /tmp/work

ADD fu* /tmp/work/
```
build

```bash
[root@docker-engine work]# cd /tmp/work/
[root@docker-engine work]# docker build -t wild-add .
  # Sending build context to Docker daemon 17.92 kB
  # Step 1 : FROM centos:7
  #  ---> 67591570dd29
  # Step 2 : MAINTAINER hihihiroro
  #  ---> Running in c3de41790144
  #  ---> 40d4a96bd53e
  # Removing intermediate container c3de41790144
  # Step 3 : RUN mkdir /tmp/work
  #  ---> Running in db4ed718baa1
  #  ---> ccce242c1c3e
  # Removing intermediate container db4ed718baa1
  # Step 4 : ADD fu* /tmp/work/
  #  ---> 1601bf04b91c
  # Removing intermediate container a21b0b91868c
  # Successfully built 1601bf04b91c
```

## 結果確認 : test4
```bash
[root@docker-engine work]# docker run -it --rm wild-add /bin/bash
[root@db0ac8aa9ab7 /]# tree /tmp/work
  # /tmp/work
  # |-- fuga-file
  # |-- fuga.tar
  # `-- funga
  # 
  # 0 directories, 3 files
[root@db0ac8aa9ab7 /]# ls -Rl /tmp/work/
  # /tmp/work/:
  # total 20
  # -rw-r--r-- 1 root root     9 Dec 19 08:25 fuga-file
  # -rw-r--r-- 1 root root 10240 Dec 19 08:25 fuga.tar
  # -rw-r--r-- 1 root root     6 Dec 19 08:27 funga
```
`copy` と同じく`fu` から始まるファイルがコピーされていることを確認できた。
ただし、ファイル名を指定した時とは違く、`tar` は展開されていない。

# まとめ
## 共通点
* ワイルドカード指定の場合、`COPY` と`ADD` 両方共ファイルをコピーする。(ただし、`ADD` はファイルしていでないと`tar` は展開されない)

## 差分
* `ADD` はURL をSOURCE に使うことができる。`COPY` はURL をSOURCE として使うことはできない。

# 参考
[COPY DOCS](https://docs.docker.com/engine/reference/builder/#/copy)
[ADD DOCS](https://docs.docker.com/engine/reference/builder/#/add)