3분만에 가능! 최고의 Dockerfile을 작성한 후에 할 일 중 하나
16998 단어 5dockerfile도커
개요
Dockerfile을 작성하는 모범 사례을 읽고 모범 사례 Dockerfile을 만들거나 만들고 싶은 사람이 대상입니다.
그 Dockerfile로 괜찮은지 3분 안에 체크할 수 있는 툴을 만들었습니다. Hadolint와 같은 단순한 Dockerfile의 Linter가 아니라 빌드한 이미지의 내용까지 세세하게 분석합니다.
일반 Linter에서는 원리적으로 불가능한 기본 이미지에 존재하는 위험도 포함하여 조사할 수 있습니다.
← GitHub의 Star를 받으면 기쁩니다.
Dockle의 내부에서 사용되고 있는 툴은 Trivy, Vuls등과 같기 때문에, 그 근처를 근거로 해, 동작 원리를 다른 기사에 정리했습니다. 사람을 떨리는 툴 「Dockle」의 구조를 해설
또한 DockerHub에서 인기있는 컨테이너에 대해 시도한 결과를 사이트로 공개하고 있습니다. 조작 방법도 포함하고, 다른 기사에 정리했습니다.
DockerHub에서 공개된 컨테이너가 안전한지 확인해 보았다 【인기 컨테이너 상위 800개! 】
즉시 시도해 보겠습니다.
--ignore
옵션 추가 실제로 할 일
Homebrew (Mac / Linux)
$ export DOCKER_CONTENT_TRUST=1
$ docker build -t test-image:v1 .
$ brew install goodwithtech/r/dockle
$ dockle test-image:v1
리눅스
$ export DOCKER_CONTENT_TRUST=1
$ docker build -t test-image:v1 .
$ VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && curl -L -o dockle.tar.gz https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz
$ tar zxvf dockle.tar.gz
$ ./dockle test-image:v1
Windows
$ export DOCKER_CONTENT_TRUST=1
$ docker build -t test-image:v1 .
$ VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && curl -L -o dockle.zip https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Windows-64bit.zip
$ unzip dockle.zip && rm dockle.zip
$ ./dockle.exe test-image:v1
도커
$ VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
goodwithtech/dockle:v${VERSION} test-image:v1
리모트의 이미지를 지정하는 경우, /var/run/docker.sock
의 -v
옵션이 불필요합니다.
결과
PASS - CIS-DI-0001: Create a user for the container
PASS - CIS-DI-0005: Enable Content trust for Docker
PASS - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
PASS - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
PASS - CIS-DI-0008: Remove setuid and setgid permissions in the images
PASS - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
PASS - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
PASS - CIS-DI-0010: Do not store secret files
PASS - DKL-DI-0001: Avoid sudo command
PASS - DKL-DI-0002: Avoid sensitive directory mounting
PASS - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
PASS - DKL-DI-0004: Use apk add with --no-cache
PASS - DKL-DI-0005: Clear apt-get caches
PASS - DKL-DI-0006: Avoid latest tag
PASS - DKL-LI-0001: Avoid empty password
PASS - DKL-LI-0002: Be unique UID
PASS - DKL-LI-0002: Be unique GROUP
여기서 확인된 항목은 CIS Benchmarks 항목 과 Dockerfile 모범 사례 중에서 발췌한 것입니다.
실패하면 어떻게 고쳐야 하는지 대략적인 제안이 표시됩니다.
WARN - CIS-DI-0001: Create a user for the container
* Last user should not be root
PASS - CIS-DI-0005: Enable Content trust for Docker
WARN - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
* not found HEALTHCHECK statement
PASS - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
INFO - CIS-DI-0008: Remove setuid and setgid permissions in the images
* Found setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x
FATAL - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
* Use COPY : /bin/sh -c #(nop) ADD file:81c0a803075715d1a6b4f75a29f8a01b21cc170cfc1bff6702317d1be2fe71a3 in /app/credentials.json
FATAL - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
* Suspicious ENV key found : MYSQL_PASSWD
FATAL - CIS-DI-0010: Do not store secret files
* Suspicious filename found : app/credentials.json
PASS - DKL-DI-0001: Avoid sudo command
FATAL - DKL-DI-0002: Avoid sensitive directory mounting
* Avoid mounting sensitive dirs : /usr
PASS - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
PASS - DKL-DI-0004: Use apk add with --no-cache
FATAL - DKL-DI-0005: Clear apt-get caches
* Use 'rm -rf /var/lib/apt/lists' after 'apt-get install' : /bin/sh -c apt-get update && apt-get install -y git
PASS - DKL-DI-0006: Avoid latest tag
FATAL - DKL-LI-0001: Avoid empty password
* No password user found! username : nopasswd
PASS - DKL-LI-0002: Be unique UID
PASS - DKL-LI-0002: Be unique GROUP
확실하지 않은 경우 README 에서 코드( CIS-DI-0001
등)를 검색해 보면 수정 팁을 찾을 수 있습니다.
모두 PASS하면 좋지만 PASS하지 않아도 괜찮습니다.
어디까지나 지표로서 이용해 주십시오.
예를 들어 루트 사용자를 피하는 모범 사례가 있습니다.
그러나 루트 사용자로 실행할 수도 있습니다.
CLI 도구 등은 기본적으로 HEALTHCHECK를 사용하지 않습니다.
tar 파일을 압축 해제하고 추가하려면 ADD를 사용할 수도 있습니다.
모범 사례에서 벗어나는 Dockerfile이 의도한 것인지를 생각하는 계기가 되면 기쁩니다.
무시하고 싶은 규칙이 있는 경우, -ignore, -i
옵션으로 코드를 지정하면(자), 그 규칙을 무시합니다.
$ dockle -i CIS-DI-0001 -i CIS-DI-0006 [IMAGE_NAME]
혹은, .dockleignore
라고 하는 파일에 지정한 코드를 써도 무시해 줍니다.
.dockleignore# rootで実行
CIS-DI-0001
# HEALTHCHECKは使わない
CIS-DI-0006
# latestタグ使う
DKL-DI-0006
얼마 안된 파일에 실행하면 다음과 같이 됩니다.
IGNORE - CIS-DI-0001: Create a user for the container
INFO - CIS-DI-0005: Enable Content trust for Docker
* export DOCKER_CONTENT_TRUST=1 before docker pull/build
IGNORE - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
PASS - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
INFO - CIS-DI-0008: Remove setuid and setgid permissions in the images
* Found setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x
IGNORE - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
FATAL - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
* Suspicious ENV key found : MYSQL_PASSWD
FATAL - CIS-DI-0010: Do not store secret files
* Suspicious filename found : app/credentials.json
PASS - DKL-DI-0001: Avoid sudo command
FATAL - DKL-DI-0002: Avoid sensitive directory mounting
* Avoid mounting sensitive dirs : /usr
PASS - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
PASS - DKL-DI-0004: Use apk add with --no-cache
FATAL - DKL-DI-0005: Clear apt-get caches
* Use 'rm -rf /var/lib/apt/lists' after 'apt-get install' : /bin/sh -c apt-get update && apt-get install -y git
PASS - DKL-DI-0006: Avoid latest tag
FATAL - DKL-LI-0001: Avoid empty password
* No password user found! username : nopasswd
PASS - DKL-LI-0002: Be unique UID
PASS - DKL-LI-0002: Be unique GROUP
마지막으로
Dockle
는 Docker 이미지를 분석합니다. 단순한 Dockerfile Linter가 아닙니다.
그러므로 Linter에는 불가능한 컨테이너 내의 파일 권한 등도 체크할 수 있습니다.
경쟁 도구에 비해 확인할 수 있는 중요한 항목이 많습니다.
재미 있다고 생각하신 분은 스타주세요!! 물론 stdin으로 만든 이미지에도 사용할 수 있으며, 범용성이 높습니다.
도커 빌드 -<<EOF
FROM busybox
RUN echo "hello world"
EOF 신경이 쓰이는 점이 있으면, GitHub
또, 2019/6/17(월)의 트위터 로, 좀 더 자세한 이야기를 합니다.
통상 1000엔 걸리는 곳을, 무료로 참가할 수 있는 「블로그 테두리」도 남아 있으므로 꼭 와 주세요.
Reference
이 문제에 관하여(3분만에 가능! 최고의 Dockerfile을 작성한 후에 할 일 중 하나), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomoyamachi/items/2397457f5d516a1fbc85
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ export DOCKER_CONTENT_TRUST=1
$ docker build -t test-image:v1 .
$ brew install goodwithtech/r/dockle
$ dockle test-image:v1
$ export DOCKER_CONTENT_TRUST=1
$ docker build -t test-image:v1 .
$ VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && curl -L -o dockle.tar.gz https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.tar.gz
$ tar zxvf dockle.tar.gz
$ ./dockle test-image:v1
$ export DOCKER_CONTENT_TRUST=1
$ docker build -t test-image:v1 .
$ VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && curl -L -o dockle.zip https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Windows-64bit.zip
$ unzip dockle.zip && rm dockle.zip
$ ./dockle.exe test-image:v1
$ VERSION=$(
curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/' \
) && docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
goodwithtech/dockle:v${VERSION} test-image:v1
PASS - CIS-DI-0001: Create a user for the container
PASS - CIS-DI-0005: Enable Content trust for Docker
PASS - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
PASS - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
PASS - CIS-DI-0008: Remove setuid and setgid permissions in the images
PASS - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
PASS - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
PASS - CIS-DI-0010: Do not store secret files
PASS - DKL-DI-0001: Avoid sudo command
PASS - DKL-DI-0002: Avoid sensitive directory mounting
PASS - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
PASS - DKL-DI-0004: Use apk add with --no-cache
PASS - DKL-DI-0005: Clear apt-get caches
PASS - DKL-DI-0006: Avoid latest tag
PASS - DKL-LI-0001: Avoid empty password
PASS - DKL-LI-0002: Be unique UID
PASS - DKL-LI-0002: Be unique GROUP
여기서 확인된 항목은 CIS Benchmarks 항목 과 Dockerfile 모범 사례 중에서 발췌한 것입니다.
실패하면 어떻게 고쳐야 하는지 대략적인 제안이 표시됩니다.
WARN - CIS-DI-0001: Create a user for the container
* Last user should not be root
PASS - CIS-DI-0005: Enable Content trust for Docker
WARN - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
* not found HEALTHCHECK statement
PASS - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
INFO - CIS-DI-0008: Remove setuid and setgid permissions in the images
* Found setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x
FATAL - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
* Use COPY : /bin/sh -c #(nop) ADD file:81c0a803075715d1a6b4f75a29f8a01b21cc170cfc1bff6702317d1be2fe71a3 in /app/credentials.json
FATAL - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
* Suspicious ENV key found : MYSQL_PASSWD
FATAL - CIS-DI-0010: Do not store secret files
* Suspicious filename found : app/credentials.json
PASS - DKL-DI-0001: Avoid sudo command
FATAL - DKL-DI-0002: Avoid sensitive directory mounting
* Avoid mounting sensitive dirs : /usr
PASS - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
PASS - DKL-DI-0004: Use apk add with --no-cache
FATAL - DKL-DI-0005: Clear apt-get caches
* Use 'rm -rf /var/lib/apt/lists' after 'apt-get install' : /bin/sh -c apt-get update && apt-get install -y git
PASS - DKL-DI-0006: Avoid latest tag
FATAL - DKL-LI-0001: Avoid empty password
* No password user found! username : nopasswd
PASS - DKL-LI-0002: Be unique UID
PASS - DKL-LI-0002: Be unique GROUP
확실하지 않은 경우 README 에서 코드(
CIS-DI-0001
등)를 검색해 보면 수정 팁을 찾을 수 있습니다.모두 PASS하면 좋지만 PASS하지 않아도 괜찮습니다.
어디까지나 지표로서 이용해 주십시오.
예를 들어 루트 사용자를 피하는 모범 사례가 있습니다.
그러나 루트 사용자로 실행할 수도 있습니다.
CLI 도구 등은 기본적으로 HEALTHCHECK를 사용하지 않습니다.
tar 파일을 압축 해제하고 추가하려면 ADD를 사용할 수도 있습니다.
모범 사례에서 벗어나는 Dockerfile이 의도한 것인지를 생각하는 계기가 되면 기쁩니다.
무시하고 싶은 규칙이 있는 경우,
-ignore, -i
옵션으로 코드를 지정하면(자), 그 규칙을 무시합니다.$ dockle -i CIS-DI-0001 -i CIS-DI-0006 [IMAGE_NAME]
혹은,
.dockleignore
라고 하는 파일에 지정한 코드를 써도 무시해 줍니다..dockleignore
# rootで実行
CIS-DI-0001
# HEALTHCHECKは使わない
CIS-DI-0006
# latestタグ使う
DKL-DI-0006
얼마 안된 파일에 실행하면 다음과 같이 됩니다.
IGNORE - CIS-DI-0001: Create a user for the container
INFO - CIS-DI-0005: Enable Content trust for Docker
* export DOCKER_CONTENT_TRUST=1 before docker pull/build
IGNORE - CIS-DI-0006: Add HEALTHCHECK instruction to the container image
PASS - CIS-DI-0007: Do not use update instructions alone in the Dockerfile
INFO - CIS-DI-0008: Remove setuid and setgid permissions in the images
* Found setuid file: usr/lib/openssh/ssh-keysign urwxr-xr-x
IGNORE - CIS-DI-0009: Use COPY instead of ADD in Dockerfile
FATAL - CIS-DI-0010: Do not store secrets in ENVIRONMENT variables
* Suspicious ENV key found : MYSQL_PASSWD
FATAL - CIS-DI-0010: Do not store secret files
* Suspicious filename found : app/credentials.json
PASS - DKL-DI-0001: Avoid sudo command
FATAL - DKL-DI-0002: Avoid sensitive directory mounting
* Avoid mounting sensitive dirs : /usr
PASS - DKL-DI-0003: Avoid apt-get/apk/dist-upgrade
PASS - DKL-DI-0004: Use apk add with --no-cache
FATAL - DKL-DI-0005: Clear apt-get caches
* Use 'rm -rf /var/lib/apt/lists' after 'apt-get install' : /bin/sh -c apt-get update && apt-get install -y git
PASS - DKL-DI-0006: Avoid latest tag
FATAL - DKL-LI-0001: Avoid empty password
* No password user found! username : nopasswd
PASS - DKL-LI-0002: Be unique UID
PASS - DKL-LI-0002: Be unique GROUP
마지막으로
Dockle
는 Docker 이미지를 분석합니다. 단순한 Dockerfile Linter가 아닙니다.
그러므로 Linter에는 불가능한 컨테이너 내의 파일 권한 등도 체크할 수 있습니다.
경쟁 도구에 비해 확인할 수 있는 중요한 항목이 많습니다.
재미 있다고 생각하신 분은 스타주세요!! 물론 stdin으로 만든 이미지에도 사용할 수 있으며, 범용성이 높습니다.
도커 빌드 -<<EOF
FROM busybox
RUN echo "hello world"
EOF 신경이 쓰이는 점이 있으면, GitHub
또, 2019/6/17(월)의 트위터 로, 좀 더 자세한 이야기를 합니다.
통상 1000엔 걸리는 곳을, 무료로 참가할 수 있는 「블로그 테두리」도 남아 있으므로 꼭 와 주세요.
Reference
이 문제에 관하여(3분만에 가능! 최고의 Dockerfile을 작성한 후에 할 일 중 하나), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tomoyamachi/items/2397457f5d516a1fbc85
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(3분만에 가능! 최고의 Dockerfile을 작성한 후에 할 일 중 하나), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tomoyamachi/items/2397457f5d516a1fbc85텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)