ການສ້າງຮູບພາບຄອນເທນເນີ

ຮູບພາບຄອນເທນເນີໃນ Fedora ແມ່ນຖືກສ້າງຂຶ້ນໂດຍການໃຊ້ Dockerfile ໃນລັກສະນະດຽວກັນກັບການສ້າງ RPM ໂດຍໃຊ້ໄຟລ໌ spec. ໃນສ່ວນນີ້ແມ່ນຄຳແນະນຳຂອງ Fedora ສຳລັບການສ້າງຮູບພາບຄອນເທນເນີໂດຍໃຊ້ Dockerfile.

ຕົວຢ່າງ Dockerfile

FROM registry.fedoraproject.org/fedora:rawhide

ARG NAME=mycontainer
ARG VERSION=0
ARG ARCH=x86_64
LABEL   com.redhat.component="$NAME" \
        name="$FGC/$NAME" \
        version="$VERSION" \
        architecture="$ARCH" \
        run="podman run -p 1337:1337 IMAGE" \
        summary="mycontainer exposes something on port 1337." \
        maintainer="Christian Glombek <lorbus@fedoraproject.org>"

EXPOSE 1337

RUN dnf -y --setopt=tsflags=nodocs install mypackage && \
    dnf clean all

COPY root/help.1 /
COPY script.sh /usr/bin/

CMD ["/usr/bin/script.sh"]

FROM

ຕາມທີ່ລະບຸໄວ້ໃນເອກະສານອ້າງອີງຂອງ Dockerfile, ຄຳສັ່ງ FROM '''ຕ້ອງ''' ແມ່ນແຖວທຳອິດຂອງ Dockerfile. ຄຳສັ່ງ FROM '''ຕ້ອງ''' ລະບຸຊື່ registry ຂອງ fedora, ຊື່ຮູບພາບ, ແລະ tag ໃຫ້ຄົບຖ້ວນ ດັ່ງທີ່ສະແດງໃນຕົວຢ່າງນີ້:

ສິ່ງນີ້ຊ່ວຍຮັບປະກັນວ່າຮູບພາບພື້ນຖານ (base image) ມາຈາກໃສ ເມື່ອຖືກສ້າງໂດຍບໍລິການ build ຫຼື ເມື່ອຜູ້ໃຊ້ສ້າງຄືນໃໝ່.

ສຳລັບຮູບພາບແບບຊັ້ນ (layered images) ສ່ວນໃຫຍ່ທີ່ສ້າງໂດຍ https://docs.pagure.org/releng/layered_image_build_service.html[Fedora Layered Docker Image Build Service], ແຖວ FROM ຈະໃຊ້ໜຶ່ງໃນຮູບພາບພື້ນຖານຂອງ Fedora ທີ່ມີຢູ່ໃນ https://registry.fedoraproject.org/[Fedora Container Registry]:

``` FROM registry.fedoraproject.org/fedora:latest ```

ນອກນັ້ນ ຍັງສາມາດໃຊ້ຮູບພາບແບບຊັ້ນອື່ນເປັນຊັ້ນພື້ນຖານໄດ້ ດັ່ງໃນຕົວຢ່າງນີ້:

``` FROM registry.fedoraproject.org/f25/kubernetes-master:latest ```


=== ປ້າຍກຳກັບ (Labels)

Dockerfile ມີແນວຄິດເລື່ອງ https://docs.docker.com/engine/reference/builder/#label[LABEL] ເຊິ່ງສາມາດເພີ່ມຂໍ້ມູນເມຕາດາຕ້າ (metadata) ໃຫ້ກັບຮູບພາບໃນຮູບແບບຄູ່ Key-Value. ຄຳແນະນຳຂອງ Fedora ກ່ຽວກັບ LABEL ແມ່ນອີງຕາມມາດຕະຖານ http://www.projectatomic.io/[Project Atomic] https://github.com/projectatomic/ContainerApplicationGenericLabels[Container Application Generic Labels] ສຳລັບການກຳນົດ LABEL.

LABELs ທີ່ '''ຈຳເປັນ''' ສຳລັບ Fedora Layered Image ມີດັ່ງນີ້:

[cols="2*", options"header"]
|===
|ຊື່
|ຄຳອະທິບາຍ

|com.redhat.component
|ຊື່ສ່ວນປະກອບໃນ Bugzilla ທີ່ຜູ້ໃຊ້ຄວນລາຍງານບັນຫາຂອງຄອນເທນເນີນີ້.

|name
|ຊື່ຂອງຮູບພາບ

|version
|ເວີຊັນຂອງຮູບພາບ

|architecture
|ສະຖາປັດຕະຍະກຳທີ່ຊອບແວໃນຮູບພາບນີ້ຮອງຮັບ (ທາງເລືອກ: ຖ້າຂ້າມໄປ, ມັນຈະຖືກສ້າງສຳລັບທຸກສະຖາປັດຕະຍະກຳທີ່ Fedora ຮອງຮັບ)

|maintainer
|ຊື່ ແລະ ອີເມລ ຂອງຜູ້ດູແລ (ປົກກະຕິແລ້ວແມ່ນຜູ້ສົ່ງຜົນງານ)

|run ຫຼື usage
|ໃຫ້ຄຳສັ່ງ run ແບບ Atomic ຫຼື ຕົວຢ່າງການເຮັດວຽກຂອງຄອນເທນເນີທີ່ຄົນສາມາດອ່ານເຂົ້າໃຈໄດ້

|summary
|ຄຳອະທິບາຍຫຍໍ້ຂອງຮູບພາບ.
|===

ປ້າຍກຳກັບ '''ທາງເລືອກ''' ສຳລັບ Fedora Layered Images

[cols="2*", options"header"]
|===
|ຊື່
|ຄຳອະທິບາຍ

|install
|ໃຊ້ສຳລັບຄຳສັ່ງ "atomic install". ບໍ່ໄດ້ໃຊ້ສຳລັບ system containers.

|uninstall
|ໃຊ້ສຳລັບຄຳສັ່ງ "atomic uninstall". ຈຳເປັນຕ້ອງມີຖ້າມີການໃຊ້ Install.

|url
|URL ທີ່ຜູ້ໃຊ້ສາມາດຊອກຫາຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບຮູບພາບ.

|help
|ຄຳສັ່ງທີ່ສາມາດສັ່ງໃຫ້ສະແດງຂໍ້ມູນການຊ່ວຍເຫຼືອ (Help).

|atomic.type
|ໃຊ້ສຳລັບ system containers, ເບິ່ງລາຍລະອຽດດ້ານລຸ່ມ.

|Generics
|https://github.com/projectatomic/ContainerApplicationGenericLabels[Container Application Generic Labels] ໃດໆທີ່ເໝາະສົມກັບຄອນເທນເນີ ເຊັ່ນ "stop", "debug", ຫຼື "changelog-url"
|===

ເບິ່ງຂໍ້ກຳນົດຂອງ LABEL (LABEL SPECIFICATION) ດ້ານລຸ່ມສຳລັບລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບສິ່ງທີ່ຈຳເປັນໃນແຕ່ລະປ້າຍກຳກັບ.

{{admon/note|Dockerfile Label Guidelines Upstream| LABEL ທີ່ໃຊ້ຢູ່ນີ້ແມ່ນການປັບໃຊ້ຂອງ Fedora ຈາກໂຄງການຕົ້ນທາງ https://projectatomic.io[Project Atomic] ທີ່ພະຍາຍາມກຳນົດ https://github.com/projectatomic/ContainerApplicationGenericLabels[Container Application Generic Labels] ລວມເຖິງ http://docs.projectatomic.io/container-best-practices/[Container Best Practices]. }}

ໃນອະດີດ LABEL ເຫຼົ່ານີ້ຕ້ອງຖືກກຳນົດໃນແຖວດຽວກັນຂອງ Dockerfile ເພື່ອບໍ່ໃຫ້ເກີດຊັ້ນ (layers) ເພີ່ມເຕີມໃນການ build. ແຕ່ OSBS ເວີຊັນໃໝ່ໆຈະລວມທຸກຊັ້ນທີ່ສ້າງຂຶ້ນເທິງຮູບພາບຫຼັກໃຫ້ເປັນຊັ້ນດຽວ, ໝາຍຄວາມວ່າບໍ່ຈຳເປັນຕ້ອງໃສ່ທຸກ LABEL ຫຼື ຄຳສັ່ງ RUN ໄວ້ໃນແຖວດຽວກັນອີກຕໍ່ໄປ.

ຕໍ່ໄປນີ້ແມ່ນຕົວຢ່າງ Dockerfile ແບບງ່າຍໆ ທີ່ມີ LABEL ທີ່ຈຳເປັນຄົບຖ້ວນ:

[source]
----
FROM registry.fedoraproject.org/fedora:rawhide

ARG NAME=mycontainer
ARG VERSION=0
ARG ARCH=x86_64
LABEL   com.redhat.component="$NAME" \
        name="$FGC/$NAME" \
        version="$VERSION" \
        architecture="$ARCH" \
        run="podman run -p 1337:1337 IMAGE" \
        summary="mycontainer exposes something on port 1337." \
        maintainer="Christian Glombek <lorbus@fedoraproject.org>"

EXPOSE 1337

RUN dnf -y --setopt=tsflags=nodocs install mypackage && \
    dnf clean all

COPY root/help.1 /
COPY script.sh /usr/bin/

CMD ["/usr/bin/script.sh"]
----


=== ຂໍ້ກຳນົດຂອງ LABEL

ລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບວິທີການໃສ່ຂໍ້ມູນໃນແຕ່ລະປ້າຍກຳກັບ.

'''com.redhat.component''': ສ່ວນປະກອບໃນ Bugzilla ທີ່ມີຢູ່ແລ້ວ ເພື່ອໃຊ້ໃນການລາຍງານບັນຫາຂອງຮູບພາບນີ້.

'''name''': ຊື່ຂອງຮູບພາບ. ຖ້າຮູບພາບນີ້ມາແທນທີ່ RPM ມາດຕະຖານ, ມັນຄວນຈະມີຊື່ດຽວກັນກັບ RPM ນັ້ນ. ຖ້າບໍ່ດັ່ງນັ້ນ, ກະລຸນາເບິ່ງຄຳແນະນຳການຕັ້ງຊື່ດ້ານເທິງ.

'''version''': ປົກກະຕິແມ່ນ 0. ດຶງຂໍ້ມູນມາຈາກຕົວປ່ຽນ ARG. ເບິ່ງຄຳອະທິບາຍໃນສ່ວນ "VERSIONING" ດ້ານລຸ່ມ.

'''architecture''': ປົກກະຕິແມ່ນ "x86_64", ຍົກເວັ້ນແຕ່ຄອນເທນເນີຈະຮອງຮັບສະຖາປັດຕະຍະກຳອື່ນ ຫຼື ທັງໝົດ.

'''usage''': ຕົວຢ່າງຄຳສັ່ງທີ່ຄົນອ່ານເຂົ້າໃຈໄດ້ເພື່ອໃຊ້ເອີ້ນຄອນເທນເນີ. ຈຳເປັນຕ້ອງມີຖ້າບໍ່ມີປ້າຍກຳກັບ run. ຄວນລວມເອົາຕົວເລືອກຕ່າງໆ ເຊັ່ນ ports, volumes, ແລະ ພະລາມິເຕີທີ່ຈຳເປັນ. ທ່ານສາມາດໃຊ້ container runtime ໃດກໍໄດ້ເປັນຕົວຢ່າງ. ຕົວຢ່າງຈາກຄອນເທນເນີ OwnCloud:

    usage="docker run -d -P -v owncloud-data:/var/lib/owncloud -v owncloud-config:/etc/owncloud owncloud"

'''summary''': ຄຳອະທິບາຍຫຍໍ້ຂອງຮູບພາບ, ເພື່ອໃຫ້ສາມາດຄົ້ນຫາໄດ້ເມື່ອມີ registry ທີ່ມີລະບົບຄົ້ນຫາ. ກະລຸນາໃສ່ຄຳສຳຄັນ (keywords) ທີ່ກ່ຽວຂ້ອງ.

'''run''': ຄຳສັ່ງເພື່ອເອີ້ນໃຊ້ຄອນເທນເນີ ທີ່ເໝາະສຳລັບການໃຊ້ຜ່ານ https://github.com/projectatomic/atomic[Atomic CLI], ລວມທັງ placeholders ແລະ ໂຄ້ດ atomic-run ທີ່ຝັງໄວ້. ຕ້ອງສາມາດເຮັດວຽກໄດ້ໃນລະບົບ Fedora Atomic ທີ່ເໝາະສົມ. ຈຳເປັນຕ້ອງມີຖ້າບໍ່ມີ "usage". ຕົວຢ່າງສຳລັບຄອນເທນເນີ Cockpit:

    run="/usr/bin/docker run -d --privileged --pid=host -v /:/host IMAGE /container/atomic-run --local-ssh"

'''install''': ຄອນເທນເນີອາດຕ້ອງການການກຽມລະບົບ host ກ່ອນຈະສາມາດເຮັດວຽກໄດ້. ໃນກໍລະນີນີ, ປ້າຍກຳກັບ install ຈະມີປະໂຫຍດໃນການກຳນົດວ່າຕ້ອງເຮັດຫຍັງແດ່ໃນ host ເພື່ອກຽມຄວາມພ້ອມ. ຂັ້ນຕອນຄວນມີໜ້ອຍທີ່ສຸດເທົ່າທີ່ຈະເປັນໄປໄດ້ ແລະ ບໍ່ຄວນລວມເອົາຂັ້ນຕອນທີ່ບໍ່ຈຳເປັນ. ຖ້າມີການໃຊ້ປ້າຍກຳກັບ install, ມັນຕ້ອງໄດ້ຮັບການທົດສອບ ແລະ ເຮັດວຽກຮ່ວມກັບ https://github.com/projectatomic/atomic[Atomic CLI] ໄດ້. ນອກນັ້ນ ຄວນມີປ້າຍກຳກັບ uninstall ເພື່ອລຶບລ້າງສິ່ງທີ່ install ໄດ້ເຮັດໄວ້. ກະລຸນາເບິ່ງ https://github.com/projectatomic/atomic#atomic-install[ເອກະສານຕົ້ນທາງ] ສຳລັບຂໍ້ມູນເພີ່ມເຕີມ. ຕົວຢ່າງສຳລັບຄອນເທນເນີ Cockpit:

    install="/usr/bin/docker run --rm --privileged -v /:/host IMAGE /container/atomic-install"

'''uninstall''': ຖ້າຄອນເທນເນີມີປ້າຍກຳກັບ install, ສ່ວນໃຫຍ່ແລ້ວຈະຕ້ອງມີປ້າຍກຳກັບ uninstall ເພື່ອລຶບໄຟລ໌ ແລະ/ຫຼື ລຶບລ້າງການຕັ້ງຄ່າຕ່າງໆທີ່ເຮັດໄວ້ໃນລະບົບ host. ບໍ່ຈຳເປັນຕ້ອງລຶບໄຟລ໌ທີ່ອາດມີຂໍ້ມູນຜູ້ໃຊ້. ໃນບາງກໍລະນີທີ່ບໍ່ມີໄຟລ໌ ຫຼື ການຕັ້ງຄ່າໃຫ້ລຶບ, ປ້າຍກຳກັບ uninstall ກໍອາດບໍ່ຈຳເປັນ. ຖ້າມີປ້າຍກຳກັບ uninstall, ມັນຕ້ອງໄດ້ຮັບການທົດສອບ ແລະ ເຮັດວຽກຮ່ວມກັບ https://github.com/projectatomic/atomic[Atomic CLI] ໄດ້. ກະລຸນາເບິ່ງ https://github.com/projectatomic/atomic#atomic-uninstall[ເອກະສານຕົ້ນທາງ] ສຳລັບຂໍ້ມູນເພີ່ມເຕີມ.

    uninstall="/usr/bin/docker run --rm --privileged -v /:/host IMAGE /container/atomic-uninstall"

'''url''': URL ທີ່ຜູ້ໃຊ້ສາມາດເບິ່ງຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບຮູບພາບ ເຊັ່ນ github, pagure repository, ຫຼື ເອກະສານຂອງຊອບແວ.

'''help''': ຄຳສັ່ງທີ່ສາມາດສັ່ງໃຫ້ສະແດງໜ້າ man page ຫຼື ຂໍ້ມູນ "help" ອື່ນໆ. ຖ້າມີ, ຕ້ອງໄດ້ຮັບການທົດສອບດ້ວຍ `atomic help`. ຖ້າທ່ານມີຄຳສັ່ງ help ແລ້ວ, ກໍບໍ່ຈຳເປັນຕ້ອງມີ Help File ອີກ (ເບິ່ງດ້ານລຸ່ມ).


=== ການກຳນົດເວີຊັນ (Versioning)

ໃນສ່ວນກ່ອນໜ້ານີ້ໄດ້ເວົ້າເຖິງ LABEL, ຫນຶ່ງໃນນັ້ນແມ່ນ Version ທີ່ຖືກກຳນົດໃນຕົວຢ່າງໂດຍໃຊ້ຕົວປ່ຽນ `ENV` `VERSION` ເຊິ່ງໃນເວລານີ້ຕ້ອງກຳນົດເປັນ `0`. OSBS ຈະຈັດການເພີ່ມເລກ release ໂດຍອັດຕະໂນມັດສຳລັບເວີຊັນຂອງຮູບພາບຄອນເທນເນີນັ້ນ.

ໃນເວລານີ້ ຍັງບໍ່ມີວິທີໃສ່ຄ່າ `Version`/`VERSION` ໃຫ້ກົງກັບເວີຊັນຫຼ້າສຸດຂອງ RPM ຫຼັກຂອງຮູບພາບຄອນເທນເນີໂດຍອັດຕະໂນມັດ. ສິ່ງນີ້ກຳລັງຢູ່ໃນ https://pagure.io/atomic-wg/issue/249[ແຜນການພັດທະນາ (roadmap)].

ເປັນຫຍັງຈຶ່ງຈຳເປັນ?

ຖ້າພວກເຮົາກຳນົດ LABEL `Version` ໃຫ້ກົງກັບເວີຊັນຂອງ RPM ໃນເວລາທີ່ກວດສອບຮູບພາບຄອນເທນເນີ, ຜູ້ດູແລຈະຕ້ອງມາອັບເດດມັນດ້ວຍຕົນເອງທຸກຄັ້ງທີ່ມີການອັບເດດ RPM ເຊິ່ງບໍ່ສະດວກ ແລະ ອາດເກີດຂໍ້ຜິດພາດໄດ້ງ່າຍ. ນອກຈາກນັ້ນ, ຍັງມີຄວາມເປັນໄປໄດ້ທີ່ເວີຊັນຂອງ RPM ອາດຖືກອັບເດດໂດຍການ rebuild ຮູບພາບແບບຊັ້ນໂດຍອັດຕະໂນມັດ ໂດຍທີ່ຜູ້ດູແລບໍ່ສາມາດອັບເດດ `Dockerfile` ໄດ້ທັນເວລາ (ການ Rebuild ອັດຕະໂນມັດແມ່ນເຮັດໂດຍ https://docs.pagure.org/releng/[Release Engineering] ເພື່ອດຶງເອົາການອັບເດດຄວາມປອດໄພມາໃຊ້). ຖ້າສິ່ງນີ້ເກີດຂຶ້ນ, ເວີຊັນຂອງຮູບພາບຄອນເທນເນີຈະບໍ່ກົງກັບເວີຊັນຂອງຊອບແວທີ່ມັນໃຫ້ບໍລິການ ເຊິ່ງຈະສ້າງຄວາມສັບສົນ ແລະ ອາດສົ່ງຜົນກະທົບທາງລົບຕໍ່ຜູ້ໃຊ້. ດັ່ງນັ້ນ, ໃນເວລານີ້ ພວກເຮົາຈຶ່ງກຳນົດວ່າເລກເວີຊັນຂອງຄອນເທນເນີ ຍັງບໍ່ມີຄວາມໝາຍສຳຄັນເທື່ອ ແຕ່ຈະເຮັດໃຫ້ມັນມີຄວາມໝາຍໂດຍໄວທີ່ສຸດ.


=== CMD / ENTRYPOINT

ອີກຢ່າງໜຶ່ງທີ່ຈຳເປັນແມ່ນການກຳນົດ CMD ຫຼື ENTRYPOINT ເພື່ອໃຫ້ເມື່ອຜູ້ໃຊ້ສັ່ງຄຳສັ່ງ (ຕົວຢ່າງ), ມັນຈະເຮັດວຽກຕາມທີ່ຄາດໄວ້:

``` docker run registry.fedoraproject.org/f25/myawesomecontainer ```

ສຳລັບຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບຄຳສັ່ງເຫຼົ່ານີ້, ກະລຸນາເບິ່ງເອກະສານຕົ້ນທາງ https://docs.docker.com/engine/reference/builder/[Dockerfile documentation].


=== ໂວນລຸ່ມ (Volumes)

ການໃຊ້ container volumes ສຳລັບຂໍ້ມູນທີ່ຕ້ອງການຄວາມຄົງຕົວ (persistent data) ແມ່ນໄດ້ຮັບອະນຸຍາດ ແລະ ແນະນຳໃຫ້ໃຊ້, ແຕ່ຕ້ອງປະຕິບັດຕາມຄຳແນະນຳດັ່ງນີ້:

* ຂໍ້ມູນຜູ້ໃຊ້ໃດໆທີ່ມີຄວາມສ່ຽງຈະສູນຫາຍເມື່ອມີການອັບເດດ '''ຕ້ອງ''' ຖືກເກັບໄວ້ໃນ volume.
* ຂໍ້ມູນການຕັ້ງຄ່າແອັບພລິເຄຊັນໃດໆທີ່ຕ້ອງການຄວາມຄົງຕົວ '''ຕ້ອງ''' ຖືກເກັບໄວ້ໃນ volume. ການຕັ້ງຄ່າຜ່ານຕົວປ່ຽນສະພາບແວດລ້ອມ (environment variables) ກໍສາມາດເຮັດໄດ້ເຊັ່ນກັນ, ທັງແບບໃຊ້ຮ່ວມກັນ ຫຼື ໃຊ້ແທນ volume ການຕັ້ງຄ່າ.
* ທຸກໆ volume ທີ່ລະບຸໄວ້ໃນ Dockerfile '''ຕ້ອງ''' ຖືກລະບຸໄວ້ໃນ Help File ນຳ.
* ຕົວຢ່າງຄຳສັ່ງ run '''ຄວນ''' ມີການຕັ້ງຊື່ volume ແບບຄົງທີ່ (ຕົວຢ່າງ: "docker run -d -v owncloud-data:/var/lib/owncloud -v owncloud-config:/etc/owncloud owncloud")
* Volume '''ຕ້ອງ''' ຖືກກຳນົດໃຫ້ແຄບທີ່ສຸດເທົ່າທີ່ຈະເປັນໄປໄດ້. ໂດຍສະເພາະແລ້ວ, ຍົກເວັ້ນແຕ່ຮູບພາບນັ້ນຈະຖືກອອກແບບມາເພື່ອໃຊ້ເປັນ system container ສຳລັບການບໍລິຫານລະບົບ, volume ຕ້ອງຖືກກຳນົດໃຫ້ mount ໄດ້ສະເພາະໂຟເດີລະບົບທີ່ໃຊ້ສະເພາະໃນຄອນເທນເນີນັ້ນ. ຕົວຢ່າງ: ຄອນເທນເນີຕ້ອງ mount /etc/application-name/ ສຳລັບໄຟລ໌ config, '''ບໍ່ແມ່ນ''' /etc/.

ແຕ່ລະ volume ໃນ Help File '''ຕ້ອງ''' ມີຂໍ້ມູນດັ່ງນີ້:
* Path ເຕັມຂອງ volume
* ເຫດຜົນທີ່ກຳນົດໃຫ້ເປັນ volume (ເຊັ່ນ ເປັນຫຍັງການຕັ້ງຄ່ານີ້ຈຶ່ງຕ້ອງມີຄວາມຄົງຕົວ ຫຼື ລະບຸວ່າຂໍ້ມູນຜູ້ໃຊ້ຖືກເກັບໄວ້ທີ່ນັ້ນ)

Volume ທີ່ລະບຸໃນ Help File '''ຄວນ''' ລວມເອົາຂໍ້ມູນກ່ຽວກັບພື້ນທີ່, ສິດການເຂົ້າເຖິງ (permissions), ແລະ ຄວາມຕ້ອງການດ້ານປະສິດທິພາບ.

ໃນ readme '''ອາດ''' ລະບຸ volume ເພີ່ມເຕີມທີ່ບໍ່ໄດ້ບັງຄັບໃນ Dockerfile, ເຊັ່ນ ບ່ອນເກັບ ssl certificates ທີ່ສ້າງຂຶ້ນໃໝ່.